PostgreSQL中的(x IS NOT NULL)vs(NOT x IS NULL)
为什么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 IS NOT NULL); RAISE NOTICE '%: %',(NOT v_bug_test IS NULL); SELECT * INTO v_bug_test FROM bug_test WHERE id = 1; RAISE NOTICE '%: %',(NOT v_bug_test IS NULL); END $$; DROP TABLE bug_test; 给出以下输出: (,): t (,): f (,): f (1,): f ??? (1,): t 虽然我希望得到这个输出: (,): t <<< (1,): t
您必须区分两种情况:将一个COLUMN与NULL进行比较,或者将整个ROW(RECORD)与NULL进行比较.
请考虑以下查询: 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 | +----+-----+-------------+-----------------+-----------------+ 我想,这就是你和我的期望.您正在检查一个COLUMN对NULL,并且您得到“txt IS NOT NULL”和“NOT txt IS NULL”是等效的. 但是,如果您进行不同的检查: SELECT id,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)和(NOT x IS NULL)是彼此相反的.另一件事(事实上既不是“x IS NULL”也不是“x IS NOT NULL”都是真的),看起来很奇怪. 然而,这就是PostgreSQL documentation所说的应该发生的事情:
我必须承认我不认为我曾经使用过针对null的行值比较,但我想如果可能存在,那么可能会有一些用例.无论如何,我认为这不常见. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |