我有以下声明
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