对于标准 ANSI/ISO SQL,空行为是相当严格定义。简而言之:
涉及NULL
值所有表达式求值NULL
,除了coalesce()
。
涉及NULL
值的所有测试均失败,但明确测试无效。以下失败:
X = null
null = null
X < null
- 等
实质上,NULL
是位于可变的结构域之外的值。这意味着逆比较运算符不对称WRT到NULL
。
下面的所有表达式,如果涉及null,失败并且空值落空。
* `X < null`
* `X >= null`
* `X > null`
* `not (X > null)`
* etc.
In standard SQL, test for `null`/`not null`, one **must** use `IS [NOT] NULL`.
在你的情况下,有一个测试成功,如果一个值为null,你可以做这样的事情:
where (A = B or B is null)
。 这将会失败A是空的,B是非空的,或者A和B非空并且比较不等于。如果A和B非空且比较相等,或者B为空,则它成功。
where A = coalesce(B,A)
。这与上述表达式的行为相同。我倾向于更喜欢它,因为语法更简洁。
注意某些SQL实现允许从标准(MS /的Sybase的Transact-SQL例如不同空行为,必须允许与标准比较运营商无效检测,并允许空char
/varchar
至选项在SQL Server的早期版本中,无效是通过将列的可变长度来实现的,无论其类型如何,空值的存储长度为零,对于char
/varchar
字段,无(空)字符串被存储为单个空间,不完全直观,作为副作用,像foo char(8) null
这样的声明相当于声明它为foo varchar(8) null
。
即使您的SQL实现支持非标准的空行为,您应该避免它,并且将其编码为具有ANSI空行为的标准SQL。在大多数支持非标准空行为的实现中,该行为可通过运行时选项进行配置。无论您是否在标准ANSI空值行为下运行,您的标准编码都会得到相同的结果。
你使用什么SQL方言?唯一解决我所见过的问题的方法是COALESCE技巧,正如你所说,这是你想要避免的。 –
@Joel Brown这不是我想要*避免* COALESCE',而是更想记住我以前见过的这种特殊语法。 – Matthew
FWIW,我从来没有听说过这样的关键字。 –