繁体   English   中英

比较Oracle SQL中的两个空字符串

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM