我有下面的语句
SELECT * FROM foo
WHERE LEN(bar) = 4 AND CONVERT(Int,bar) >= 5000
在值bar
以一个4个字符的长度是整数。 其它值不是整数,因此试图其中之一转换为整数时抛出一个异常的转换。
我认为这足以把LEN(bar)
的前CONVERT(Int,bar) >= 5000
。 但事实并非如此。
我如何样的优先特定的where子句? 在我的例子我当然希望用4的长度来选择所有值,转换和比较之前。
我有下面的语句
SELECT * FROM foo
WHERE LEN(bar) = 4 AND CONVERT(Int,bar) >= 5000
在值bar
以一个4个字符的长度是整数。 其它值不是整数,因此试图其中之一转换为整数时抛出一个异常的转换。
我认为这足以把LEN(bar)
的前CONVERT(Int,bar) >= 5000
。 但事实并非如此。
我如何样的优先特定的where子句? 在我的例子我当然希望用4的长度来选择所有值,转换和比较之前。
6个回答,其中有5不(用于SQL Server)工作...
SELECT *
FROM foo
WHERE CASE WHEN LEN(bar) = 4 THEN
CASE WHEN CONVERT(Int,bar) >= 5000 THEN 1 ELSE 0 END
END = 1;
在WHERE / INNER JOIN条件可以以任何顺序查询优化器确定要执行是最好的。 有没有短路布尔评估。
特别是对于你的问题,因为你知道,有4个字符的数据是一个数字,那么你可以做一个直接的辞书(文本)比较(是的,它的工作原理):
SELECT *
FROM foo
WHERE LEN(bar) = 4 AND bar > '5000';
尝试这个
SELECT bar FROM
(
SELECT CASE
WHEN LEN(bar) = 4 THEN CAST( bar as int)
ELSE CAST(-1 as int) END bar
FROM Foo
) Foo
WHERE bar>5000