nac*_*all 8 sql t-sql sql-server
我试图在SQL服务器中执行以下查询:
declare @queryWord as nvarchar(20) = 'asdas'
SELECT * FROM TABLE_1
WHERE (ISDATE(@queryWord) = 1)
AND TABLE_1.INIT_DATE = CONVERT(Date, @queryWord)
Run Code Online (Sandbox Code Playgroud)
这显然会导致错误,因为'asdas'无法转换为Date
.虽然,我期待一种不同的行为.也就是说,因为它ISDATE(@queryWord) = 1
是假的,我期待SQL不检查第二个条件,但显然,它确实如此.
我知道还有其他一些方法可以执行此查询,但这不是我的问题.我想知道是否有一些方法不检查第二个条件是第一个不满足.我很好奇,因为我认为SQL已经做到了这一点.
RBa*_*ung 11
SQL Server不会做短路(也不应该).
如果你需要它在某些情况下不尝试某些东西,你需要以编写查询的方式强制它.
对于此查询,最简单的修复方法是CASE
在WHERE
子句中使用表达式.
declare @queryWord as nvarchar(20) = 'asdas'
SELECT * FROM TABLE_1
WHERE TABLE_1.INIT_DATE = (CASE WHEN ISDATE(@queryWord) = 1
THEN CONVERT(Date, @queryWord)
ELSE NULL END)
Run Code Online (Sandbox Code Playgroud)
Off-hand CASE
和query-nesting是我能想到的唯一两种支持的方法,用于强制SQL中依赖条件的评估顺序.
归档时间: |
|
查看次数: |
3802 次 |
最近记录: |