有没有办法明确说明发生WHERE条件的顺序?我意识到查询优化器将查看WHERE子句的所有部分,以确定满足查询的最有效方法,如以下答案中所述:
但是,有没有办法检查其他条件会依赖的条件?这些线程的答案之一涉及到我所追求的,但没有提供解决方案:
select *
from INFORMATION_SCHEMA.TABLES
where ISNUMERIC(table_name) = 1 and CAST(table_name as int) <> 0
Run Code Online (Sandbox Code Playgroud)
这可能会失败,因为可以在确定table_name字段是否为数字之前评估CAST(因此会为无效转换引发错误).
当然必须有办法实现这一目标吗?
使用派生表:
SELECT *
FROM (
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE ISNUMERIC(table_name)=1
) AS i
WHERE CAST(table_name AS INT)<>0
Run Code Online (Sandbox Code Playgroud)
或者,很可能按顺序运行,您可以使用CASE语句:
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE 0<>(CASE WHEN ISNUMERIC(table_name)=1
THEN CAST(table_name AS INT)
ELSE 0 END)
Run Code Online (Sandbox Code Playgroud)
应该注意的是,对于SQL Server,存在CASE技巧将失败的情况.请参阅CASE上的文档,备注:
CASE语句按顺序评估其条件,并在满足条件的第一个条件下停止.在某些情况下,在CASE语句接收表达式的结果作为其输入之前,将计算表达式.评估这些表达式的错误是可能的.首先评估出现在CASE语句的WHEN参数中的聚合表达式,然后提供给CASE语句.例如,以下查询在生成MAX聚合的值时会产生除零错误.这在评估CASE表达式之前发生.
Run Code Online (Sandbox Code Playgroud)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实现也可能如此.
| 归档时间: |
|
| 查看次数: |
305 次 |
| 最近记录: |