[英]Comparing two empty Strings in Oracle SQL
嗨,今天我遇到了奇怪的情况。 我有一个where子句,where条件是返回String的条件,我想检查它是否为空。 而且,当返回空字符串时,Oracle仍然将其视为不同的字符串。 因此,我走了一步,准备了简单的查询:
select 1 from dual where 1 = 1;
returns: 1
select 1 from dual where 'A' = 'A';
returns: 1
现在我不明白的是:
select 1 from dual where '' = '';
No result.
即使我检查它们是否不同,仍然没有结果。
select 1 from dual where '' != '';
No result.
有人可以帮我解释一下吗?
Oracle将空字符串视为NULL。 这是一个陷阱。 记下它,并希望它永远不会在生产中对您造成伤害。
原因是正如@Captain Kenpachi所解释的。 如果要比较两个字符串(或其他相同的类型),并且要容忍NULL(或Oracle中的空字符串,因为它会将其视为相同),则需要进行IS测试。
您可以尝试使用永远不会使用的流氓值来作弊,但墨菲定律规定某人会一天。 该技术还具有一个缺点,即流氓值应与要比较的事物的类型匹配,即比较需要流氓字符串的字符串,而比较需要流氓日期的日期。 这也意味着您不能不加思索地随意剪切和粘贴它。 示例: WHERE NVL(col1,'MyRougeValue')=NVL(col2,'MyRougeValue')
标准版本将在其中显式测试NULL WHERE (col1=col2 OR (col1 IS NULL AND col2 IS NULL))
相反的变为WHERE NOT(col1=col2 OR (col1 IS NULL AND col2 IS NULL))
我已经看到了一个相反的版本(在Toad的数据比较工具中可以看到) WHERE (col1<>col2 OR (col1 IS NULL AND col2 IS NOT NULL) OR (col1 IS NOT NULL AND col2 IS NULL))
Oracle确实具有方便的DECODE
函数,该函数基本上是在IF a IS b THEN c ELSE d
因此相等性是WHERE DECODE(col1,col2,1,0)=1
,而相反是WHERE DECODE(col1,col2,1,0)=0
。 您可能会发现这比显式IS测试要慢一些。 它是Oracle专有的,但有助于弥补空字符串问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.