我正在为一个Oracle表编写一个约束检查,在约束检查中,我有一个与null的比较:
CASE
WHEN COL_A = 'A' AND COL_B = NULL THEN 'KO'
但是,DataGrip突出显示了表示可疑的单词COL_B = NULL
,并建议我将其替换为COL_B IS NULL
。
由于我在脚本中大量使用= NULL
,我想知道这是否是一个坏的做法和潜在的风险。
我搜索了一下,没有找到任何结果。我想知道为什么DataGrip告诉我它是可疑的,为什么他们选择了一个如此强烈的词。
谢谢
2条答案
按热度按时间8yoxcaq71#
predicate
COL_B = NULL
的形式非常好,但它从不为TRUE(如 * 注解者 * 所指出的那样编辑)--这使得用法 * 可疑 * 或毫无意义。示例
cwtwac6a2#
SQL(不仅仅是Oracle的方言)使用三进制逻辑(与许多使用二进制逻辑的语言相反),比较有三种可能的结果:
TRUE
、FALSE
或NULL
(未知)。在三进制逻辑中,当你使用运算符时(即
=
、!=
、<
、>=
等)将NULL
与任何值进行比较,则输出为NULL
(永远不要使用TRUE
或FALSE
),因为您要求将未知值与其他值进行比较,结果可能为真,也可能为假(或者错),即使你把一个未知的东西和另一个未知的东西进行比较,你也只是不知道。因此,虽然
COL_A = NULL
是有效语法,但它的计算结果始终为NULL
,并且由于它的计算结果永远不会为TRUE
,因此您的筛选条件永远不会为真,并且永远不会匹配CASE
表达式的该分支。如果您想检查某个列是否为
NULL
(未知),则需要使用IS NULL
。