অনুমানের মধ্যে নয় মূল মানগুলি


245

এই সমস্যাটি তখন উঠে এল যখন আমি যা ভাবিছিলাম তার জন্য বিভিন্ন রেকর্ড গণনা পেয়েছি একইরকম প্রশ্নগুলির মধ্যে একটি not in whereহ'ল একটি সীমাবদ্ধতা এবং অন্যটি একটি ব্যবহার করে left joinnot inসীমাবদ্ধতার টেবিলটিতে একটি নাল মান (খারাপ ডেটা) ছিল যার কারণে এই ক্যোয়ারিকে 0 টি রেকর্ডের একটি গণনা ফিরিয়ে আনা হয়েছিল। আমি ধরণের কারণ বুঝতে পারি তবে আমি ধারণাটি পুরোপুরি উপলব্ধি করতে কিছু সহায়তা করতে পারি।

এটিকে সহজভাবে বর্ণনা করতে, কেন কোয়েরি একটি ফলাফল দেয় তবে বি দেয় না?

A: select 'true' where 3 in (1, 2, 3, null)
B: select 'true' where 3 not in (1, 2, null)

এটি এসকিউএল সার্ভার ২০০৫-এ ছিল I আমি এটিও পেয়েছি যে কলিং set ansi_nulls offবিয়ের ফলে একটি ফল ফিরে দেয়।

উত্তর:


283

ক্যোয়ারি এ এর ​​মতো:

select 'true' where 3 = 1 or 3 = 2 or 3 = 3 or 3 = null

যেহেতু 3 = 3সত্য, আপনি একটি ফলাফল পাবেন।

কোয়েরি বি এর মতো:

select 'true' where 3 <> 1 and 3 <> 2 and 3 <> null

কখন ansi_nullsচালু থাকে, 3 <> nullঅজানা হয়, সুতরাং প্রিডিকেট অচেনাকে মূল্যায়ন করে এবং আপনি কোনও সারি পান না।

কখন ansi_nullsবন্ধ থাকে, 3 <> nullসত্য হয়, সুতরাং প্রিডিকেট সত্যের কাছে মূল্যায়ন করে এবং আপনি একটি সারি পান।


11
কেউ কি কখনও উল্লেখ করেছেন যে এই সেটে নয় এর NOT INধারাবাহিক <> andআচরণকে একটি সিরিজে রূপান্তর করে অন্য কিছুতে রূপান্তর করা ?
ইয়ান বয়ড

8
@ আইয়ান - দেখে মনে হচ্ছে "এ নট ইন ('এক্স', 'ওয়াই')" এসকিউএল এ আসলে একটি <> 'এক্স' এবং এ <> 'ওয়াই' এর একটি নাম alias (আমি দেখতে পাচ্ছি যে আপনি এটি নিজেকে স্ট্যাকওভারফ্লো . com / Qestions / 3924694 / … এ আবিষ্কার করেছেন , তবে এই প্রশ্নে আপনার আপত্তিটির সমাধান হয়েছে কিনা তা নিশ্চিত করতে চেয়েছিলেন।)
রায়ান ওলসন

আমার অনুমান যে এটি আমার ব্যাখ্যা করা SELECT 1 WHERE NULL NOT IN (SELECT 1 WHERE 1=0);খালি রেজাল্টের পরিবর্তে কেন একটি সারি দেয় explains
বিনকি

2
এটি এসকিউএল সার্ভারের একটি খুব খারাপ আচরণ, কারণ যদি এটি "ইস নুল" ব্যবহার করে নুল তুলনাটি প্রত্যাশা করে, তবে এটি একই আচরণের অনুচ্ছেদে প্রসারিত হওয়া উচিত, এবং বোকামি দিয়ে ভুল শব্দার্থতাকে নিজের মধ্যে প্রয়োগ করা উচিত নয়।
OzrenTkalcecKrznaric

@ বিঙ্কি, আপনি এখানে জিজ্ঞাসা করেন যে এখানে যদি চালানো হয় rextester.com/l/sql_server_online_compiler তবে এখানে চালানো সার্থক নয় sqlcourse.com/cgi-bin/interpreter.cgi
ইসতিয়াক আহমেদ

53

আপনি যখনই NULL ব্যবহার করেন আপনি সত্যিই একটি ত্রি-মূল্যবান যুক্তি দিয়ে কাজ করছেন।

আপনার প্রথম ক্যোয়ারী যেখানে ক্লোর মূল্যায়ণ হিসাবে মূল্যায়ন করে ফলাফলগুলি প্রত্যাবর্তন করে:

    3 = 1 or 3 = 2 or 3 = 3 or 3 = null
which is:
    FALSE or FALSE or TRUE or UNKNOWN
which evaluates to 
    TRUE

দ্বিতীয়টি:

    3 <> 1 and 3 <> 2 and 3 <> null
which evaluates to:
    TRUE and TRUE and UNKNOWN
which evaluates to:
    UNKNOWN

অজানা যেমন মিথ্যা নয় আপনি কল করে সহজেই এটি পরীক্ষা করতে পারেন:

select 'true' where 3 <> null
select 'true' where not (3 <> null)

উভয় প্রশ্নেরই আপনাকে কোনও ফল দেবে না

অজানা যদি মিথ্যের মতোই হয় তবে ধরে নেওয়া যে প্রথম জিজ্ঞাসা আপনাকে মিথ্যা দেবে দ্বিতীয়টি সত্যের কাছে মূল্যায়ন করতে হবে যেমন এটি নফল (ফলস) এর মতোই হত।
ব্যাপার সেটা না.

স্কেল সার্ভারসেন্ট্রাল এ এই বিষয়ে একটি খুব ভাল নিবন্ধ আছে

NULLs এবং ত্রি-মূল্যবান যুক্তির পুরো বিষয়টি প্রথমে কিছুটা বিভ্রান্ত হতে পারে তবে টিএসকিউএল-এ সঠিক প্রশ্নগুলি লেখার জন্য এটি বোঝা জরুরি

আমি আর একটি নিবন্ধ সুপারিশ করব এসকিউএল সমষ্টি কার্য এবং NULL


33

NOT IN অজানা মানের সাথে তুলনা করলে 0 টি রেকর্ড প্রদান করে

যেহেতু NULLএকটি অজানা, সম্ভাব্য মানগুলির তালিকায় NOT INএকটি NULLবা NULLগুলি থাকা ক্যোয়ারী সর্বদা 0রেকর্ডগুলি ফিরিয়ে দেবে কারণ NULLমান পরীক্ষা করা হচ্ছে না তা নিশ্চিত হওয়ার কোনও উপায় নেই ।


3
সংক্ষেপে এই উত্তর। আমি এটি কোনও উদাহরণ ছাড়াই বোঝা সহজ বলে মনে করেছি।
গোবিন্দ রায়

18

নাল সাথে তুলনা করা অনির্ধারিত, যদি না আপনি শুল্ক ব্যবহার করেন।

সুতরাং, 3 টি NUL এর সাথে তুলনা করার সময় (ক্যোরি এ), এটি অনির্ধারিত ফিরে আসে।

অর্থাৎ 'সত্য' নির্বাচন করুন যেখানে 3 ইন (1,2, নাল) এবং 'সত্য' নির্বাচন করুন যেখানে 3 ইন (1,2, নাল) নয়

একই ফলাফল তৈরি করবে, যেমন (বর্ণিত) এখনও অপরিজ্ঞাত নয়, তবে সত্য নয়


দুর্দান্ত পয়েন্ট। 1 টি নির্বাচন করুন যেখানে নাল ইন (নাল) সারিগুলি ফেরায় না (আনসি))
ক্রোকুসেক

9

লেখার সময় এই প্রশ্নের শিরোনামটি হ'ল

এসকিউএল নট ইন সীমাবদ্ধতা এবং নাল মান

প্রশ্নের পাঠ্য থেকে এটি উপস্থিত হয় যে SELECTকোনও এসকিউএল ডিডিএল না করে কোনও এসকিউএল ডিএমএল কোয়েরিতে সমস্যা দেখা দিয়েছে CONSTRAINT

যাইহোক, বিশেষ করে শিরোনামটির শব্দ দেওয়াতে, আমি এটি উল্লেখ করতে চাই যে এখানে কিছু বিবৃতিগুলি সম্ভাব্য বিভ্রান্তিমূলক বক্তব্য, (প্যারাফ্রেসিং) এর পংক্তির পাশাপাশি রয়েছে le

যখন প্রাকটিকেট অজানাতে মূল্যায়ন করে আপনি কোনও সারি পাবেন না।

এটি এসকিউএল ডিএমএলের ক্ষেত্রে হলেও, বাধা বিবেচনা করার সময় প্রভাবটি ভিন্ন হয়।

প্রশ্নের পূর্বাভাসগুলি থেকে সরাসরি নেওয়া দুটি সীমাবদ্ধতার সাথে এই খুব সাধারণ টেবিলটি বিবেচনা করুন (এবং @ ব্রান্নানের উত্তরের উত্তরে সম্বোধন করা হয়েছে):

DECLARE @T TABLE 
(
 true CHAR(4) DEFAULT 'true' NOT NULL, 
 CHECK ( 3 IN (1, 2, 3, NULL )), 
 CHECK ( 3 NOT IN (1, 2, NULL ))
);

INSERT INTO @T VALUES ('true');

SELECT COUNT(*) AS tally FROM @T;

@ ব্রাননের উত্তর অনুসারে, প্রথম সীমাবদ্ধতা (ব্যবহার INকরে NOT IN) সত্যকে মূল্যায়িত করে এবং দ্বিতীয় সীমাবদ্ধতা (ব্যবহার করে ) অচেনাকে মূল্যায়ন করে। যাহোক সন্নিবেশ সফল হয়! সুতরাং, এই ক্ষেত্রে বলা শক্তভাবে সঠিক নয় যে "আপনি কোনও সারি পান না" কারণ ফলস্বরূপ আমরা সত্যই একটি সারি sertedোকিয়েছি।

উপরের প্রভাবটি এসকিউএল -২২ স্ট্যান্ডার্ড সম্পর্কিত সত্যই সঠিক। এসকিউএল -৯২ অনুমানের থেকে নীচের অংশটির তুলনা করুন এবং তার বিপরীতে করুন

7.6 যেখানে ধারা

ফলাফলের ফলাফল টি এর সারিগুলির একটি সারণী যার জন্য অনুসন্ধানের অবস্থার ফলাফলটি সত্য।

৪.১০ সততা বাধা

একটি সারণী চেক সীমাবদ্ধতা সন্তুষ্ট হয় এবং কেবল যদি সন্ধানের সারণির কোনও সারিটির জন্য নির্দিষ্ট অনুসন্ধান শর্তটি মিথ্যা না থাকে।

অন্য কথায়:

এসকিউএল ডিএমএলে, ফলগুলি থেকে সারিগুলি সরিয়ে ফেলা হয় যখন WHEREমূল্যায়নগুলি অজানাতে যায় কারণ এটি হয় না not "সত্য" শর্তটি পূরণ ।

এসকিউএল DDL (অর্থাত সীমাবদ্ধতার) সালে সারি ফলাফলের থেকে সরানো হয় না যখন তারা অজানা নির্ণয় করা হয়েছে কারণ এটি নেই শর্ত সন্তুষ্ট "মিথ্যা নয়।"

যদিও এসকিউএল ডিএমএল এবং এসকিউএল ডিডিএলে যথাক্রমে প্রভাবগুলি পরস্পরবিরোধী বলে মনে হতে পারে, তবে অজানা ফলাফলকে কোনও বাধা মেটাতে দেয় (আরও সঠিকভাবে, তাদের কোনও সীমাবদ্ধতা পূরণ করতে ব্যর্থ না হওয়ার অনুমতি দিয়ে) 'সন্দেহের উপকার' দেওয়ার জন্য ব্যবহারিক কারণ রয়েছে : এই আচরণ ছাড়াই, প্রতিটি প্রতিবন্ধকতা স্পষ্টভাবে নাল পরিচালনা করতে হবে এবং এটি একটি ভাষা নকশার দৃষ্টিকোণ থেকে খুব অসন্তুষ্টিজনক হবে (উল্লেখ করার জন্য নয়, কোডারদের জন্য একটি সঠিক ব্যথা!)

পিএস যদি আপনি এই যুক্তি অনুসরণ করা চ্যালেঞ্জ হিসাবে খুঁজে পেয়েছেন যেমন "অজানা কোনও সীমাবদ্ধতা মেটাতে ব্যর্থ হয় না" যেমনটি আমি এটি লিখছি, তবে এসকিউএল ডিডিএল এবং এসকিউএল-এর যে কোনও কলাচিহ্ন বাদ দিয়ে কেবল এগুলি দিয়ে আপনি বিতরণ করতে পারবেন তা বিবেচনা করুন ps ডিএমএল যা নাল তৈরি করে (যেমন বাইরের সাথে যোগ দেয়)!


আমি সত্যই ভাবিনি যে এই বিষয়ে কিছু বলার বাকি আছে। মজাদার.
জ্যামি আইডে

2
@ জ্যামি আইড: প্রকৃতপক্ষে, এই বিষয়ে আমার আরও একটি উত্তর আছে: কারণ নাল NOT IN (subquery)জড়িত করা অপ্রত্যাশিত ফলাফল দিতে পারে, এটি IN (subquery)সম্পূর্ণরূপে এড়াতে এবং সর্বদা ব্যবহার করার জন্য লোভনীয় হয় NOT EXISTS (subquery)(যেমন আমি একবার করেছিলাম!) কারণ মনে হয় এটি সর্বদা নালগুলি সঠিকভাবে পরিচালনা করে। তবে, এমন কিছু ক্ষেত্রে রয়েছে যেখানে NOT IN (subquery)প্রত্যাশিত ফলাফল দেওয়া হয় যেখানে NOT EXISTS (subquery)অপ্রত্যাশিত ফলাফল দেয়! বিষয়টিতে আমার নোটগুলি খুঁজে পেতে পারলে আমি এখনও এটি লিখতে পারি (নোটগুলির প্রয়োজন কারণ এটি স্বজ্ঞাত নয়!) উপসংহারটি একই, যদিও: নালগুলি এড়ান!
onedaywhen

@ অধিবেল যখন আমি আপনার এই দৃ by়তায় বিভ্রান্ত হলাম যে সামঞ্জস্যপূর্ণ আচরণ করার জন্য (অভ্যন্তরীণভাবে সামঞ্জস্যপূর্ণ, অনুমানের সাথে সামঞ্জস্যপূর্ণ নয়) বিশেষ প্রয়োজন হবে special "সারণীর চেক সীমাবদ্ধতাটি যদি সন্তুষ্ট হয় তবেই যদি নির্দিষ্ট অনুসন্ধান শর্তটি সত্য হয়" তবে এটি পড়ার জন্য কি 4.10 পরিবর্তন করা যথেষ্ট হবে না?
ডিলানইং ই

@DylanYoung: না, বৈশিষ্ট একটি অত্যন্ত গুরুত্বপূর্ণ কারণে যে ভাবে ভাষায় হয়: তিন মান যুক্তিবিজ্ঞান থেকে এসকিউএল ভুগছেন, তারা সব কোথায় মান TRUE, FALSEএবংUNKNOWN । আমি মনে করি 4.10 পড়তে পারত, "যদি একটি সারণীর প্রতিটি সারিটির জন্য নির্দিষ্ট অনুসন্ধান শর্তটি সত্য বা অজানা হয় তবে কেবল একটি টেবিল চেক সীমাবদ্ধতা সন্তুষ্ট হয়" - বাক্যটির শেষে আমার পরিবর্তনটি নোট করুন - যা আপনি বাদ দিয়েছিলেন - - থেকে "কোন" "সব জন্য '। আমি লজিক্যাল মান পুঁজিতে প্রয়োজন বোধ কারণ অর্থ' সত্য 'ও' 'স্বাভাবিক ভাষায় নিশ্চয় শাস্ত্রীয় দুই মূল্যবান যুক্তিবিজ্ঞান পড়ুন উচিত নয়। মিথ্যা
onedaywhen

1
বিবেচনা করুন: CREATE TABLE T ( a INT NOT NULL UNIQUE, b INT CHECK( a = b ) );- এখানে উদ্দেশ্যটি হ'ল bহয় সমান aবা নਾਲ হতে হবে। যদি কোনও প্রতিবন্ধকতার সত্যিকারের সন্তুষ্ট হতে হয় তবে আমাদের স্পষ্টভাবে নালগুলি হ্যান্ডেল করার জন্য বাধা পরিবর্তন করতে হবে CHECK( a = b OR b IS NULL )। সুতরাং, প্রতিটি প্রতিবন্ধকতার সাথে ...OR IS NULLযুক্ত প্রতিটি নালাম কলামের জন্য ব্যবহারকারীদের যুক্তি যুক্ত করা দরকার : আরও জটিলতা, আরও বাগ যখন তারা এটি করতে ভুলে গিয়েছিল, ইত্যাদি। সুতরাং আমি মনে করি এসকিউএল স্ট্যান্ডার্ড কমিটি কেবল ব্যবহারিক হওয়ার চেষ্টা করেছিল।
onedaywhen

7

এ-তে, ফলনকারী (ফলস, ফলস, সত্য, অজানা) প্রতিটি সদস্যের বিপরীতে সমতার জন্য পরীক্ষা করা হয়। যেহেতু উপাদানগুলির মধ্যে একটি সত্য, শর্তটি সত্য। (এটিও সম্ভব যে এখানে কিছু সংক্ষিপ্ত-সার্কিট করা হয়েছিল, সুতরাং এটি প্রথম সত্যটি হিট হওয়ার সাথে সাথে এটি বন্ধ হয়ে যায় এবং কখনই 3 = NULL মূল্যায়ন করে না))

বি তে, আমি মনে করি এটি শর্তটি নয় (3 ইন (1,2, নাল)) হিসাবে মূল্যায়ন করছে। সেট ফলনের বিপরীতে সমানতার জন্য 3 পরীক্ষা করা (FALSE, FALSE, UNKNOWN), যা UNKNOWN তে একত্রিত। (অজানা) অজানা ফল দেয়। সুতরাং সামগ্রিকভাবে শর্তটির সত্যতা অজানা, যা শেষে মূলত FALSE হিসাবে বিবেচিত হয়।


7

এটি এখানে উত্তরগুলি থেকে শেষ করা যেতে পারে যা NOT IN (subquery)নালগুলি সঠিকভাবে পরিচালনা করে না এবং এর পক্ষে এড়ানো উচিত NOT EXISTS। তবে এ জাতীয় সিদ্ধান্ত অকাল হতে পারে। নিম্নলিখিত দৃশ্যে, ক্রিস ডেটকে জমা দেওয়া (ডাটাবেস প্রোগ্রামিং এবং ডিজাইন, খণ্ড ২ নং 9, সেপ্টেম্বর 1989), এটি হ'ল NOT INনালগুলি সঠিকভাবে পরিচালনা করে এবং সঠিক ফলাফলটি দেয়, পরিবর্তেNOT EXISTS

spসরবরাহকারীদের প্রতিনিধিত্ব করতে একটি টেবিল বিবেচনা করুন ( sno) যারা pnoপরিমান ( qty) পরিমাণে সরবরাহ করার জন্য পরিচিত known টেবিলটি বর্তমানে নিম্নলিখিত মানগুলি ধারণ করে:

      VALUES ('S1', 'P1', NULL), 
             ('S2', 'P1', 200),
             ('S3', 'P1', 1000)

নোট করুন যে পরিমাণটি হ'ল অযোগ্য, অর্থাৎ কোনও সরবরাহকারী কোন পরিমাণে না জানা থাকলেও অংশ সরবরাহ করার জন্য পরিচিত তা রেকর্ড করতে সক্ষম হতে।

কাজটি হ'ল সরবরাহকারী যারা সরবরাহের পার্ট নম্বর 'পি 1' হিসাবে পরিচিত তবে 1000 এর পরিমাণে নয় বলে সন্ধান করা।

NOT INসরবরাহকারী 'এস 2' কেবলমাত্র সঠিকভাবে সনাক্ত করতে নিম্নলিখিত ব্যবহারগুলি :

WITH sp AS 
     ( SELECT * 
         FROM ( VALUES ( 'S1', 'P1', NULL ), 
                       ( 'S2', 'P1', 200 ),
                       ( 'S3', 'P1', 1000 ) )
              AS T ( sno, pno, qty )
     )
SELECT DISTINCT spx.sno
  FROM sp spx
 WHERE spx.pno = 'P1'
       AND 1000 NOT IN (
                        SELECT spy.qty
                          FROM sp spy
                         WHERE spy.sno = spx.sno
                               AND spy.pno = 'P1'
                       );

তবে নীচের ক্যোয়ারিতে একই সাধারণ কাঠামো ব্যবহার করা হয়েছে তবে এর সাথে NOT EXISTSতবে ভুলভাবে সরবরাহকারী 'এস 1' অন্তর্ভুক্ত রয়েছে ফলাফলের জন্য (অর্থাত্ পরিমাণটি নাল):

WITH sp AS 
     ( SELECT * 
         FROM ( VALUES ( 'S1', 'P1', NULL ), 
                       ( 'S2', 'P1', 200 ),
                       ( 'S3', 'P1', 1000 ) )
              AS T ( sno, pno, qty )
     )
SELECT DISTINCT spx.sno
  FROM sp spx
 WHERE spx.pno = 'P1'
       AND NOT EXISTS (
                       SELECT *
                         FROM sp spy
                        WHERE spy.sno = spx.sno
                              AND spy.pno = 'P1'
                              AND spy.qty = 1000
                      );

সুতরাং NOT EXISTSকবচ এটা হাজির হতে পারে না!

অবশ্যই, সমস্যার উত্স হ'ল নালগুলির উপস্থিতি, সুতরাং 'আসল' সমাধানটি সেই নালগুলি দূর করা।

এটি দুটি সারণী ব্যবহার করে (অন্যান্য সম্ভাব্য নকশাগুলির মধ্যে) অর্জন করা যেতে পারে:

  • sp সরবরাহকারী অংশ সরবরাহ হিসাবে পরিচিত
  • spq সরবরাহকারীরা জ্ঞাত পরিমাণে অংশ সরবরাহ করতে পরিচিত

উল্লেখ করে সেখানে সম্ভবত একটি বিদেশী কী বাধা থাকতে হবে যেখানে spqরেফারেন্স sp

এরপরে ফলাফলটি 'বিয়োগ' রিলেশনাল অপারেটর ( EXCEPTস্ট্যান্ডার্ড এসকিউএল-এর মূলশব্দ হওয়া) ব্যবহার করে প্রাপ্ত করা যেতে পারে

WITH sp AS 
     ( SELECT * 
         FROM ( VALUES ( 'S1', 'P1' ), 
                       ( 'S2', 'P1' ),
                       ( 'S3', 'P1' ) )
              AS T ( sno, pno )
     ),
     spq AS 
     ( SELECT * 
         FROM ( VALUES ( 'S2', 'P1', 200 ),
                       ( 'S3', 'P1', 1000 ) )
              AS T ( sno, pno, qty )
     )
SELECT sno
  FROM spq
 WHERE pno = 'P1'
EXCEPT 
SELECT sno
  FROM spq
 WHERE pno = 'P1'
       AND qty = 1000;

1
ঈশ্বর. আসলে এটি লেখার জন্য আপনাকে ধন্যবাদ .... এটি আমাকে উন্মাদ করে
দিচ্ছিল

6

নাল ইঙ্গিত করে এবং ডেটার অনুপস্থিতি, এটি অজানা, কোনও কিছুর ডেটা মান নয়। প্রোগ্রামিং ব্যাকগ্রাউন্ডের লোকদের পক্ষে এটি বিভ্রান্ত করা খুব সহজ কারণ সি টাইপের ভাষায় পয়েন্টার নাল ব্যবহার করা আসলে কিছুই নয়।

সুতরাং প্রথম ক্ষেত্রে 3 প্রকৃতপক্ষে (1,2,3, নাল) এর সেটটিতে তাই সত্য প্রত্যাবর্তন হয়

দ্বিতীয়টি তবে আপনি এটি হ্রাস করতে পারেন

'সত্য' নির্বাচন করুন যেখানে 3 অন (নাল) নয়

সুতরাং কিছুই ফেরেনি কারণ পার্সার আপনার সাথে যে সেটটি তুলনা করছেন সে সম্পর্কে কিছুই জানে না - এটি খালি সেট নয় তবে একটি অজানা সেট। (1, 2, নাল) ব্যবহার করা সাহায্য করে না কারণ (1,2) সেটটি অবশ্যই স্পষ্টতই মিথ্যা, তবে তারপরে আপনি এটি অজানাটির বিরুদ্ধে করছেন, যা অজানা।


6

যদি আপনি NUL গুলি জড়িত একটি subquery জন্য নট ইন ফিল্টার করতে চান তবে নাল না জন্য চেক করুন

SELECT blah FROM t WHERE blah NOT IN
        (SELECT someotherBlah FROM t2 WHERE someotherBlah IS NOT NULL )

আমার বাইরের যোগদানের ক্যোয়ারিতে সমস্যা ছিল যা বিশেষ পরিস্থিতিতে কোনও রেকর্ড ফিরিয়ে দেয়নি, সুতরাং নুল এবং বিদ্যমান রেকর্ড পরিস্থিতি উভয়ের জন্য এই সমাধানটি পরীক্ষা করে দেখলাম এবং এটি আমার পক্ষে কাজ করেছে, যদি অন্য কোনও সমস্যা ঘটে থাকে তবে আমি এখানে উল্লেখ করব, ধন্যবাদ অনেক ধন্যবাদ।
কিউমাস্টার

1

এটি ছেলের জন্য:

select party_code 
from abc as a
where party_code not in (select party_code 
                         from xyz 
                         where party_code = a.party_code);

এটি আনসী সেটিংস নির্বিশেষে কাজ করে


মূল প্রশ্নের জন্য: বি: 'সত্য' নির্বাচন করুন যেখানে 3 টি নয় (1, 2, নাল) নালগুলি অপসারণের একটি উপায় সম্পন্ন করতে হবে যেমন 'সত্য' নির্বাচন করুন যেখানে 3 টি নয় (1, 2, ইসনুল (নাল, 0) ) সামগ্রিক যুক্তিটি হ'ল, যদি NULL কারণ হয় তবে কোয়েরির কোনও ধাপে NULL মানগুলি সরিয়ে ফেলার কোনও উপায় সন্ধান করুন।

যা প্রায়ই ক্ষেত্রে দেখা যায় হিসেবে এবিসি যেখানে party_code (Xyz যেখানে party_code নাল নয় থেকে নির্বাচন করুন party_code) কিন্তু সৌভাগ্য আপনি ক্ষেত্র ভুলে গেছি নেই NULLs অনুমতি দেয়, থেকে party_code নির্বাচন

1

এসকিউএল সত্য মানগুলির জন্য ত্রি-মূল্যবান যুক্তি ব্যবহার করে। INক্যোয়ারী প্রত্যাশিত ফলাফলের উত্পাদন করে:

SELECT * FROM (VALUES (1), (2)) AS tbl(col) WHERE col IN (NULL, 1)
-- returns first row

তবে একটি যুক্ত NOTকরলে ফলাফলগুলি উল্টে না:

SELECT * FROM (VALUES (1), (2)) AS tbl(col) WHERE NOT col IN (NULL, 1)
-- returns zero rows

এটি কারণ যে উপরের ক্যোয়ারীটি নীচের সমতুল্য:

SELECT * FROM (VALUES (1), (2)) AS tbl(col) WHERE NOT (col = NULL OR col = 1)

এখানে কীভাবে ক্লজটি মূল্যায়ন করা হয়:

| col | col = NULL (1) | col = 1 | col = NULL OR col = 1 | NOT (col = NULL OR col = 1) |
|-----|----------------|---------|-----------------------|-----------------------------|
| 1   | UNKNOWN        | TRUE    | TRUE                  | FALSE                       |
| 2   | UNKNOWN        | FALSE   | UNKNOWN (2)           | UNKNOWN (3)                 |

লক্ষ্য করুন:

  1. NULLফলন জড়িত তুলনাUNKNOWN
  2. ORঅভিব্যক্তি যেখানে operands কেউই হয় TRUEএবং অন্তত একটি প্রতীক হয় UNKNOWNউৎপাদনের UNKNOWN( সুত্র )
  3. NOTএর UNKNOWNউৎপাদনের UNKNOWN( সুত্র )

আপনি উপরোক্ত উদাহরণটি আরও দুটি মানের (যেমন এনএলএল, 1 এবং 2) পর্যন্ত প্রসারিত করতে পারেন তবে ফলাফলটি একই হবে: মানগুলির মধ্যে একটি হয় NULLতবে কোনও সারি মেলে না।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.