Postgresql Postgres返回的行未通过非空检查
我很想知道为什么下面的Postgresql Postgres返回的行未通过非空检查,postgresql,Postgresql,我很想知道为什么下面的IF(previous\u foo.NOT NULL)条件失败,因为将此行更改为IF(previous\u foo.total NOT NULL)计算结果为true CREATE OR REPLACE FUNCTION foo_total(the_bar bar) RETURNS numeric LANGUAGE plpgsql STABLE AS $$ DECALRE previous_foo foo; BEGIN
IF(previous\u foo.NOT NULL)
条件失败,因为将此行更改为IF(previous\u foo.total NOT NULL)
计算结果为true
CREATE OR REPLACE FUNCTION foo_total(the_bar bar)
RETURNS numeric
LANGUAGE plpgsql
STABLE
AS $$
DECALRE
previous_foo foo;
BEGIN
previous_foo := foo_previous(the_bar);
IF (previous_foo IS NOT NULL) THEN -- fails
-- IF (previous_foo.total IS NOT NULL) -- works
return previous_foo.total;
END IF;
RETURN NULL;
END;
$$;
那么,previous\u-foo
怎么可能为空,而previous\u-foo.total
怎么可能不为空:/
之前的foo正在做类似的事情供参考
create or replace function previous_foo(the_bar bar) returns foo
LANGUAGE sql STABLE
AS $$
SELECT foo.* FROM foo
WHERE -- conditions;
$$;
这符合和SQL标准:
如果表达式是行值表达式,则当行表达式本身为NULL或所有行字段为NULL时,is NULL为true;而当行表达式本身为非NULL且所有行字段为非NULL时,is NOT NULL为true
组合中的某些字段必须为空
这不是标准委员会关于无效的唯一奇怪裁决…谢谢,是的,好的,这有点“道理”。该行中的某些字段为空。