1

我有以下声明

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

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

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

我怎样才能优先考虑特定的 where 子句?在我的示例中,我显然想在转换和比较它们之前选择所有长度为 4 的值。

4

2 回答 2

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';
于 2012-12-03T07:47:04.127 回答
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
于 2012-12-03T07:43:14.357 回答