有没有办法明确说明 WHERE 条件发生的顺序?我意识到查询优化器将查看 WHERE 子句的所有部分,以确定满足查询的最有效方法,如这些答案中所述:
SQL 中 where 子句的顺序重要吗 https://stackoverflow.com/questions/11436469/does-order-of-where-clauses-matter-in-sql
SQL - WHERE 条件的顺序重要吗? https://stackoverflow.com/questions/3152182/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(因此会因无效转换而引发错误)。
肯定有办法实现这一目标吗?
使用派生表:
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-trick 失败的情况。请参阅CASE 文档、备注 https://learn.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql#remarks:
CASE 语句按顺序评估其条件,并在第一个满足条件的条件处停止。在某些情况下,在 CASE 语句接收表达式结果作为其输入之前,会对表达式进行求值。计算这些表达式时可能会出现错误。首先计算出现在 CASE 语句的 WHEN 参数中的聚合表达式,然后将其提供给 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 实现也可能如此。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)