2016-03-07 10 views
5

Esiste un modo per indicare esplicitamente l'ordine per le condizioni WHERE? Mi rendo conto che l'ottimizzatore di query esaminerà tutte le parti del clausola WHERE per determinare il modo più efficiente per soddisfare la domanda, come indicato in queste risposte:Sql - Ordine esplicito delle condizioni WHERE?

Does order of where clauses matter in SQL

SQL - Does the order of WHERE conditions matter?

Tuttavia, c'è nessun modo per verificare una condizione su cui si baseranno altre condizioni? Una delle risposte da quei fili tocca quello che sto cercando, ma non offre una soluzione:

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

Questo può non perché il cast può essere valutata prima di determinare se il campo nome_tabella è numerico (e quindi genera un errore per il cast non valido).

Sicuramente ci deve essere un modo per raggiungere questo obiettivo?

risposta

4

Utilizzando una tabella derivata in quanto tale:

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

In alternativa, e molto probabilmente eseguito in ordine, è possibile utilizzare un'istruzione CASE:

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

Va notato che, per SQL Server (l'unico RDBMS con cui ho exp) esistono situazioni in cui il trucco CASE fallirà. Vedi documentation on CASE, Remarks:

L'istruzione CASE valuta le sue condizioni in sequenza e si arresta con la prima condizione di cui è soddisfatta la condizione. In alcune situazioni, un'espressione viene valutata prima che un'istruzione CASE riceva i risultati dell'espressione come input. Sono possibili errori nella valutazione di queste espressioni. Le espressioni aggregate che appaiono negli argomenti WHEN a un'istruzione CASE vengono valutate per prime, quindi fornite nell'istruzione CASE. Ad esempio, la seguente query produce un errore di divisione per zero durante la produzione del valore dell'aggregato MAX. Ciò si verifica prima di valutare l'espressione 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 ; 

sto ritenendo sospetto che questo potrebbe anche essere vero per altre implementazioni RDBMS.

+1

Non carino, ma lo prenderò. Grazie! – McFixit

1

penso che ti stai chiedendo se la valutazione può cortocircuitare - potrebbe aiutare a leggere questo:

Is the SQL WHERE clause short-circuit evaluated?

Quindi, probabilmente è necessario valutare la prima condizione prima di tentare il secondo. In MSSQL, potresti usare un CTE per fare il primo. Oppure, un'altra opzione potrebbe essere quella di utilizzare un CASE per eseguire solo il secondo in determinate condizioni.