oracle DataGrip告诉我,将列的值与null进行比较是“可疑的”,这是一种不好的做法吗?

mnowg1ta  于 2023-03-17  发布在  Oracle
关注(0)|答案(2)|浏览(195)

我正在为一个Oracle表编写一个约束检查,在约束检查中,我有一个与null的比较:

CASE
    WHEN COL_A = 'A' AND COL_B = NULL THEN 'KO'

但是,DataGrip突出显示了表示可疑的单词COL_B = NULL,并建议我将其替换为COL_B IS NULL
由于我在脚本中大量使用= NULL,我想知道这是否是一个坏的做法和潜在的风险。
我搜索了一下,没有找到任何结果。我想知道为什么DataGrip告诉我它是可疑的,为什么他们选择了一个如此强烈的词。
谢谢

8yoxcaq7

8yoxcaq71#

predicate COL_B = NULL的形式非常好,但它从不为TRUE(如 * 注解者 * 所指出的那样编辑)--这使得用法 * 可疑 * 或毫无意义。

示例

create table tab (col_b int);
insert into tab (col_b) values(null);

select count(*) from tab where col_b is null;

  COUNT(*)
----------
         1
         
 
select count(*) from tab where col_b = null;

  COUNT(*)
----------
         0
cwtwac6a

cwtwac6a2#

SQL(不仅仅是Oracle的方言)使用三进制逻辑(与许多使用二进制逻辑的语言相反),比较有三种可能的结果:TRUEFALSENULL(未知)。
在三进制逻辑中,当你使用运算符时(即=!=<>=等)将NULL与任何值进行比较,则输出为NULL(永远不要使用TRUEFALSE),因为您要求将未知值与其他值进行比较,结果可能为真,也可能为假(或者错),即使你把一个未知的东西和另一个未知的东西进行比较,你也只是不知道。
因此,虽然COL_A = NULL是有效语法,但它的计算结果始终为NULL,并且由于它的计算结果永远不会为TRUE,因此您的筛选条件永远不会为真,并且永远不会匹配CASE表达式的该分支。
如果您想检查某个列是否为NULL(未知),则需要使用IS NULL

CASE
WHEN COL_A = 'A' AND COL_B IS NULL THEN 'KO'
END

相关问题