为什么不?对于在较新版本的 SQL Server 中删除的此功能,有什么好的替代方法?
我到处都使用以下模式:
select * from ContactReport
order by
case ContactDate when null then 'a' else 'b' end, ContactMethod
Run Code Online (Sandbox Code Playgroud)
我可以把它改成这样,但它会更慢:
select * from ContactReport
order by
case ContactDate when null then 'a'+ContactMethod else 'b'+ContactMethod end
Run Code Online (Sandbox Code Playgroud)
在某些情况下,我有非常大的表,这将是一个问题。我可以添加一些虚拟列,例如 Dummy1,Dummy2,Dummy3,值为 1 到每个我需要它的表中,这样我就可以通过它订购...
有什么更好的想法吗?
您误解了错误告诉您的内容。在CASE语句的分支中使用常量是完全没问题的——只是不允许整个表达式解析为常量。
case ContactDate when null then 'a' else 'b' end
Run Code Online (Sandbox Code Playgroud)
是不正确的。启用 ANSI 默认值后,它将始终评估为“b”,因为没有任何内容等于 null。SQL Server 可以在编译时告知这一点,并不断将其折叠为b. 按在所有行中都相同的值进行排序是没有意义的 - 因此会出现错误。
这个错误不是新的,它至少在 2008 年就发生了 - 这是一件好事,因为否则你只会默默地得到错误的结果,而没有NULL根据需要首先排序日期的行。
您的表达式确实适用于ANSI_NULLSoff (并在ORDER BY子句中编译 OK ),但我不建议使用它。
请改用以下表达式。
case when ContactDate is null then 'a' else 'b' end
Run Code Online (Sandbox Code Playgroud)
或者,这可以缩短为
IIF(ContactDate is null, 'a', 'b')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
88 次 |
| 最近记录: |