我有以下声明
SELECT * FROM foo
WHERE LEN(bar) = 4 AND CONVERT(Int,bar) >= 5000
bar
中长度恰好为4个字符的值是整数。其他值不是整数,因此在尝试将其中一个转换为整数时会抛出转换异常。
我认为将LEN(bar)
放在CONVERT(Int,bar) >= 5000
之前已经足够了。但事实并非如此。
我如何确定特定where子句的优先级?在我的例子中,我显然想要在转换和比较它们之前选择长度为4的所有值。
答案 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