Sql - WHERE条件的显式顺序?

时间:2016-03-07 16:12:59

标签: sql

有没有办法明确说明发生WHERE条件的顺序?我意识到查询优化器将查看WHERE子句的所有部分,以确定满足查询的最有效方法,如下面的答案中所述:

Does order of where clauses matter in SQL

SQL - Does the order of WHERE conditions matter?

但是,有没有办法检查其他条件会依赖的条件?这些线程的答案之一涉及我所追求的,但没有提供解决方案:

select *
from INFORMATION_SCHEMA.TABLES
where ISNUMERIC(table_name) = 1 and CAST(table_name as int) <> 0

这可能会失败,因为在确定table_name字段是否为数字之前可以评估CAST(因此会为无效的转换引发错误)。

当然必须有办法实现这个目标吗?

2 个答案:

答案 0 :(得分:5)

使用派生表:

SELECT *
FROM (
      SELECT *
      FROM INFORMATION_SCHEMA.TABLES
      WHERE ISNUMERIC(table_name)=1
     ) AS i
WHERE CAST(table_name AS INT)<>0

或者,很可能按顺序运行,您可以使用CASE语句:

SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE 0<>(CASE WHEN ISNUMERIC(table_name)=1 
          THEN CAST(table_name AS INT)
          ELSE 0 END)

应该注意的是,对于SQL Server,存在CASE技巧将失败的情况。请参阅documentation on CASE, Remarks

  

CASE语句按顺序评估其条件,并在满足条件的第一个条件下停止。 在某些情况下,在CASE语句接收表达式的结果作为其输入之前,将计算表达式。可能会出现评估这些表达式的错误。首先计算WHEN CASE语句参数中出现的聚合表达式,然后提供给CASE语句。例如,以下查询在生成MAX聚合的值时会产生除零错误。这在评估CASE表达式之前发生。

WITH Data (value) AS 
( 
SELECT 0 
UNION ALL 
SELECT 1 
) 
SELECT 
   CASE 
      WHEN MIN(value) <= 0 THEN 0 
      WHEN MAX(1/value) >= 100 THEN 1 
   END 
FROM Data ;

我怀疑其他RDBMS实现也可能是这样。

答案 1 :(得分:1)

我认为你在问评估是否可以短路 - 这可能有助于阅读:

Is the SQL WHERE clause short-circuit evaluated?

因此,您可能需要在尝试第二个条件之前评估第一个条件。在MSSQL中,您可以使用CTE来完成第一个操作。或者,另一种选择可能是使用CASE仅在某些条件下执行第二种情况。