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

比较Oracle SQL中的两个空字符串,sql,oracle,Sql,Oracle,嗨,今天我遇到了一个奇怪的情况。我有一个where子句where was条件,它返回字符串,我想检查它是否为空。当它返回空字符串时,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.

嗨,今天我遇到了一个奇怪的情况。我有一个where子句where was条件,它返回字符串,我想检查它是否为空。当它返回空字符串时,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解释的那样。如果要比较两个字符串(或其他相同类型的字符串)并允许空字符串(或Oracle中视为相同的空字符串),则需要进行IS测试

你可以尝试使用一个永远不会被使用的流氓值的常见欺骗,但墨菲定律规定有一天会有人被使用。这种技术还有一个缺点,即rogue值应该与比较对象的类型相匹配,即比较字符串时需要rogue字符串,而比较日期时需要胭脂日期。这也意味着你不能不加思考就随意地剪切和粘贴它。例子:
其中NVL(col1,'MyRougeValue')=NVL(col2,'MyRougeValue')

标准版本是显式测试空值
其中(col1=col2或(col1为NULL,col2为NULL))

相反的变为
,其中不是(col1=col2或(col1为NULL,col2为NULL))

我看到了一个冗长的相反版本(如蟾蜍的数据比较工具所示)
其中(col1col2或(col1为NULL,col2为非NULL)或(col1为非NULL,col2为NULL))


Oracle确实有一个方便的
DECODE
功能,基本上是
如果a是b,那么c是d
,因此等式是
其中DECODE(col1,col2,1,0)=1
,相反的是
其中DECODE(col1,col2,1,0)=0
。您可能会发现这比显式IS测试稍微慢一点。它是Oracle专有的,但有助于弥补空字符串问题。

空字符串与Oracle中的空字符串相同。请参阅和,特别是关于比较的部分。@AlexPoole感谢您提供这些文档的链接。很多人都有意见,事实总是受欢迎的。真正奇怪的是,与Oracle的许多文档不同,这篇文档非常清晰!真正的“gotcha”是它并不总是将空字符串视为null<代码>'foo'| |'返回
'foo'
。但更令人困惑的是,
'foo'| | null
也返回
'foo'
@a_horse_,但这仍然将空字符串视为null?令人困惑的是,在这两种情况下都不会返回null,我认为,从其他事物的行为来看,这是可能的。(我以前没有注意到文档中说有一天可能会改变……是不是重新定义
varchar
?)的时间尺度相同@AlexPoole:那么连接运算符的行为不符合SQL标准。因为每一个涉及
null
的表达式都应该产生
null
,就像
42*null
@a_horse_和_no_名称一样,在Oracle使用ANSI语法之前,我从Oracle到SQL Server。在SQL Server中将null与字符串连接会导致null[grin],这让我感到非常困惑。与你的经历正好相反。那是15分钟的调试,我希望我能回来:-)或者?谢谢@William Robertson,我已经更正了。这只是一个“表面”问题。