2016-03-07 25 views
5

WHERE条件の実行順序を明示する方法はありますか?私はこれらの答えで述べたように、クエリオプティマイザは、クエリを満たすために最も効率的な方法を決定するためにWHERE句のすべての部分を見ていきますことを実現:Sql - 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 

これは、CASTは、TABLE_NAMEフィールドが数値であるかどうかを判断する前に評価することができますので、失敗(したがって、することができます無効なキャストのエラーを投げる)。

確かにこれを達成する方法が必要ですか?

答えて

4

などの派生テーブルを使用した:それはのためのことに留意すべきである

select * 
from INFORMATION_SCHEMA.TABLES 
where 0<>(CASE WHEN ISNUMERIC(table_name) = 1 
      THEN CAST(table_name as int) 
      ELSE 0 END) 

:順序で

SELECT* 
FROM(
    select * 
    from INFORMATION_SCHEMA.TABLES 
    where ISNUMERIC(table_name) = 1 
) AS i 
WHERE CAST(table_name as int) <> 0 
また

、最も可能性の高い走行、あなたはCASEステートメントを使用することができますSQL Server(唯一のRDBMSである)には、CASE-trickが失敗する状況が存在します。 documentation on CASE, 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の実装のための真のかもしれません疑っています。

+1

私はそれを受け取りません。ありがとう! – McFixit

1

私は評価がショートをすることができた場合、あなたが求めていると思う - それはこれを読むために役立つかもしれない:

Is the SQL WHERE clause short-circuit evaluated?

だから、あなたはおそらく第二を試みる前に、最初の条件を評価する必要があります。 MSSQLでは、最初にCTEを使用できます。または、別のオプションは、CASEを使用して特定の条件下で秒を実行することです。