之前,另一个执行WHERE子句(Execute a WHERE clause before anot

2019-10-17 10:56发布

我有下面的语句

SELECT * FROM foo
WHERE LEN(bar) = 4 AND CONVERT(Int,bar) >= 5000

在值bar以一个4个字符的长度是整数。 其它值不是整数,因此试图其中之一转换为整数时抛出一个异常的转换。

我认为这足以把LEN(bar)的前CONVERT(Int,bar) >= 5000 。 但事实并非如此。

我如何样的优先特定的where子句? 在我的例子我当然希望用4的长度来选择所有值,转换和比较之前。

Answer 1:

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';


Answer 2:

尝试这个

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


文章来源: Execute a WHERE clause before another one