(x নুল নয়) বনাম (নট এক্স ইজ নুল নয়) পোস্টগ্রিজ এসকিউএল এ


16

কেন x IS NOT NULLসমান নয় NOT x IS NULL?

এই কোড:

CREATE TABLE bug_test (
    id int,
    name text
);

INSERT INTO bug_test
VALUES (1, NULL);

DO $$
DECLARE
    v_bug_test bug_test;
BEGIN
    RAISE NOTICE '%: %', v_bug_test, (v_bug_test IS NULL);
    RAISE NOTICE '%: %', v_bug_test, (v_bug_test IS NOT NULL);
    RAISE NOTICE '%: %', v_bug_test, (NOT v_bug_test IS NULL);

    SELECT *
    INTO v_bug_test
    FROM bug_test
    WHERE id = 1;

    RAISE NOTICE '%: %', v_bug_test, (v_bug_test IS NULL);
    RAISE NOTICE '%: %', v_bug_test, (v_bug_test IS NOT NULL);
    RAISE NOTICE '%: %', v_bug_test, (NOT v_bug_test IS NULL);
END
$$;

DROP TABLE bug_test;

নিম্নলিখিত আউটপুট দেয়:

(,): t
(,): f
(,): f
(1,): f
(1,): f ???
(1,): t

যদিও আমি এই আউটপুটটি পেতে আশা করব:

(,): t
(,): f
(,): f
(1,): f
(1,): t <<<
(1,): t

1
আপনি কি সত্যই NUL এর বিপরীতে পুরো রেকর্ডটি পরীক্ষা করছেন তা বিবেচনা করছেন? (আপনি হলেন
জোলোলো

@ জোয়ানোলো আমি idআমার আসল কোডবেসটিতে যাচাই করার জন্য কোডটি স্যুইচ করেছি, তবে কয়েক ঘন্টা ব্যয় করেই কেবল কোনও সমস্যার সন্ধান করছে।
অনিল

1
এটা যে আমার মনে হচ্ছে rec_variable IS NOT NULLযদি চেক করা হয় সব কলাম নাল না তৈরী করছেন, rec_variable IS NULLযদি চেক করা হয় সব কলাম শূন্য হয়। সুতরাং NOT rec_variable IS NULLআমি যা প্রত্যাশা করেছি তা দেয় - "ভিতরে কি কিছু আছে?" প্রশ্নের উত্তর।
অনিল

উত্তর:


17

আপনাকে দুটি অবস্থার মধ্যে পার্থক্য করতে হবে: আপনি একটি কলমের তুলনা করুন NUL এর সাথে, বা আপনি NUL এর সাথে পুরো ROW (RECORD) তুলনা করুন।

নিম্নলিখিত কোয়েরি বিবেচনা করুন:

SELECT
    id, 
    txt, 
    txt     IS NULL AS txt_is_null, 
    NOT txt IS NULL AS not_txt_is_null, 
    txt IS NOT NULL AS txt_is_not_null
FROM
    (VALUES
        (1::integer, NULL::text)
    ) 
    AS x(id, txt) ;

আপনি এটি পান:

+----+-----+-------------+-----------------+-----------------+
| id | txt | txt_is_null | not_txt_is_null | txt_is_not_null | 
+----+-----+-------------+-----------------+-----------------+
|  1 |     | t           | f               | f               | 
+----+-----+-------------+-----------------+-----------------+

এটি, আমি অনুমান করি, আপনি এবং আমি কী আশা করব। আপনি নুলের বিপরীতে একটি কলম পরীক্ষা করছেন, এবং আপনি "txt is NULL" এবং "নেক্সট Txt IS NULL" সমতুল্য হবেন না।

তবে, আপনি যদি অন্য একটি চেক করেন:

SELECT
    id, 
    txt, 
    x       IS NULL AS x_is_null,
    NOT x   IS NULL AS not_x_is_null,
    x   IS NOT NULL AS x_is_not_null
FROM
    (VALUES
        (1, NULL)
    ) 
    AS x(id, txt) ;

তাহলে তুমি পাও

+----+-----+-----------+---------------+---------------+
| id | txt | x_is_null | not_x_is_null | x_is_not_null |
+----+-----+-----------+---------------+---------------+
|  1 |     | f         | t             | f             |
+----+-----+-----------+---------------+---------------+

এটি অবাক হতে পারে। একটি জিনিস যুক্তিসঙ্গত বলে মনে হচ্ছে (x IS NULL) এবং (নয় x IS NULL) একে অপরের বিপরীত। অন্য জিনিসটি ("x IS NULL" বা "x IS NULL" সত্য নয়) এটিকে অদ্ভুত দেখাচ্ছে।

যাইহোক, পোস্টগ্রাইএসকিউএল ডকুমেন্টেশন বলছে যে এটি হওয়া উচিত:

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

আমাকে অবশ্যই স্বীকার করতে হবে যে আমি কখনই শূন্যের তুলনায় সারি মূল্যবান তুলনা ব্যবহার করেছি বলে মনে করি না, তবে আমি অনুমান করি যে যদি সম্ভাবনাটি থাকে তবে এটির জন্য কিছু ব্যবহারের ঘটনাও থাকতে পারে। আমি কোনভাবেই সাধারণ বলে মনে করি না।


হ্যাঁ, ব্যাখ্যাটি বোঝায় এবং এটি পোস্ট করার পরে আমি যে পরীক্ষাগুলি দিয়েছিলাম তার ফলাফলগুলির সাথে মেলে। আমি কেন পুরো রেকর্ড ভেরিয়েবলের তুলনা করি কারণ আমার পটভূমিটি নন-এসকিউএল ভাষায়, যেখানে এটি বেশ সাধারণ। ব্যবহারের ক্ষেত্রে, আমি জিনিসটি সহজ যখন কোনও ব্যক্তি রেকর্ড ভেরিয়েবলের সমস্ত ক্ষেত্র ভরাট হয় কিনা তা পরীক্ষা করতে চায় (rec নীল নয়), ক্ষেত্রের মাধ্যমে ক্ষেত্রের মাধ্যমে এটি করার পরিবর্তে doing
অনিল

1
@Anil: যথাযথভাবে ব্যবহারের ক্ষেত্রে আপনি উল্লেখ আগে জেগে popped করেছেন: stackoverflow.com/questions/21021102/...
এরউইন Brandstetter
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.