为什么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
您是否正在考虑实际上正在对照NULL检查整个记录的事实。(您是
—
joanolo 2016年
@joanolo是的。我已经切换了代码以
—
尼尔,2016年
id
在我的真实代码库中进行检查,但是只有在花了几个小时搜索问题之后才进行检查。
在我看来,
—
尼尔
rec_variable IS NOT NULL
正在检查是否所有列都不为空,而rec_variable IS NULL
正在检查是否所有列都为空。因此,NOT rec_variable IS NULL
给出了我所期望的-对“里面有东西吗?”这个问题的答案。