在另一个之前执行WHERE子句

时间:2012-12-03 07:11:30

标签: sql sql-server sql-server-2005

我有以下声明

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

bar中长度恰好为4个字符的值是整数。其他值不是整数,因此在尝试将其中一个转换为整数时会抛出转换异常。

我认为将LEN(bar)放在CONVERT(Int,bar) >= 5000之前已经足够了。但事实并非如此。

我如何确定特定where子句的优先级?在我的例子中,我显然想要在转换和比较它们之前选择长度为4的所有值。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

试试这个

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
相关问题