Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql null计算为false时的大小写_Postgresql - Fatal编程技术网

Postgresql null计算为false时的大小写

Postgresql null计算为false时的大小写,postgresql,Postgresql,今天,我对这个案例行为感到惊讶: select case when null then true else false end; case ------ f 我希望它返回null,因为将null强制转换为布尔yelds anull而不是false: select null::boolean is null; ?column? ---------- t 对这种行为的基本原理有何评论?我遗漏了什么?因为国家: 如果条件为真时为否,则大小写表达式的值为 ELSE子句中的结果。如果省略E

今天,我对这个
案例
行为感到惊讶:

select case when null then true else false end;
 case 
------
 f
我希望它返回
null
,因为将
null
强制转换为布尔yelds a
null
而不是
false

select null::boolean is null;
 ?column? 
----------
 t
对这种行为的基本原理有何评论?我遗漏了什么?

因为国家:

如果条件为真时为否,则大小写表达式的值为 ELSE子句中的结果。如果省略ELSE子句且没有匹配的条件,则结果为null

Postgresql不会强制转换输出,因为您有一个
else
条件,所以您得到的是
false
。下一个查询返回空值(因为没有
else
条件)


您编写的
CASE
语句有两个分支:

“当为空时,则为真”(因为
null
不等于
true

else
branch,这将在常规
分支中没有匹配项时发生

例如:

CASE WHEN val = 1 THEN 5
     WHEN val = 2 THEN 10
     ELSE 20 /*all other values, including null*/
END

您认为
CASE
表达式就像将
null
作为函数或运算符的输入一样,其中null输入通常会导致null输出:

regress=> SELECT 't'::boolean = NULL::boolean;
 bool 
------

(1 row)
实际上,就空处理而言,它的行为类似于
WHERE
子句:

craig=> SELECT 't' WHERE NULL;
 ?column? 
----------
(0 rows)
WHERE
子句中以及在
CASE
中,来自测试表达式的
NULL
结果被视为“非真,因此为假”。在某些方面,令人遗憾的是,SQL标准没有使
NULL
导致
WHERE
表达式出现错误,而不是将其视为false,但事实就是这样

这是
NULL
人格分裂的另一个痛苦症状,SQL规范无法确定
NULL
是指“未知/未定义的值”还是“缺少值”,就像
NULL
和聚合的可怕混乱一样

case when p.parent_id is null then false else true end as has_parent

您可以使用“选择”检查数据列是否为空:

select 
  ID,
  case (select 1 where DATA is null)
    when 1 then 'no data'
    else data
  end
from ...
万一你(也)需要类似的东西

if column is null then 'value' 
使用:

如果您仍然需要案例陈述,请使用:

case COALESCE(column_name, 'asdf') 
when 'asdf' then true
else false
end as desired_column_name

使用您的示例,当
val
为null时,您不能说是否存在匹配项,因为
null=1
结果null既不为false也不为true。@ClodoaldoNeto:
CASE
进入条件计算为
true
的第一个分支。如果没有分支为
TRUE
ELSE
将获胜,如果缺少,则默认为
NULL
。这就是全部。如果条件为真时为否,当条件的计算结果为
null
时,您不能说它不是真的。你不知道。它可以是true或false中的任何一个。“null=true”是否为true?不,它是空的。这意味着第一个分支被拒绝,另一个分支发生。SQL中的条件测试不是布尔测试。因此,所有的大脑疼痛都是由零值引起的。那么这仅仅是因为SQL规范?Postgresql开发人员只是遵循它,而不是做“正确的事情”?我怀疑是这样。@ClodoaldoNeto是的,这就是规范和理智世界冲突的基本政策。在这种情况下,我认为这是相当合理的,虽然
CASE
不是一个函数,它是一个有自己规则的特殊表达式。函数可以有特殊的空处理;见证Oracle的
解码
。PostgreSQL无法在不重写SQL规范的情况下修复此问题,以完全修复关于空值的混淆,这一过程使其与其他所有内容完全不兼容。感谢您的合并。我在那个函数上完全被隔开了:P
COALESCE(column_name, 'replacment for null value') as column_name
case COALESCE(column_name, 'asdf') 
when 'asdf' then true
else false
end as desired_column_name