2012-02-27 11 views
15

Sto cercando un modo per creare istruzioni caso in una query di selezione sql utilizzando meno di e maggiore di segni. Ad esempio, voglio selezionare una classifica sulla base di una variabile:Utilizzare segni di confronto all'interno di una dichiarazione di caso sql

DECLARE @a INT 
SET @a = 0 

SELECT CASE 
     WHEN @a < 3 THEN 0 
     WHEN @a = 3 THEN 1 
     WHEN @a > 3 THEN 2 
     END 

mi piacerebbe scrivere come:

DECLARE @a INT 
SET @a = 0 

SELECT CASE @a 
     WHEN < 3 THEN 0 
     WHEN 3 THEN 1 
     WHEN > 3 THEN 2 
     END 

... ma SQL non mi ha lasciato usare il < e> firma in questo modo. C'è un modo che posso fare questo è SQL 2005, o devo usare il codice come nel primo.

Il motivo per cui desideravo solo il codice una volta è perché renderebbe il codice molto più leggibile/manutenibile e anche perché non sono sicuro che SQL Server dovrà eseguire il calcolo per ciascuna istruzione CASE.

Sto cercando un VB.NET istruzione case equivelent:

Select Case i 
    Case Is < 100 
     p = 1 
    Case Is >= 100 
     p = 2 
End Select 

Forse non è possibile in SQL e che è ok, voglio solo confermare che.

+2

Il 'CASE' funziona come CASE o SWITCH più altri linguaggi di programmazione. Non vedo il punto del tuo bisogno. –

+0

Scusa, la fine della mia domanda è stata interrotta. Fammi sapere se continui a non capire cosa sto cercando di raggiungere – Greg

+0

L'espressione CASE causerà un cortocircuito e valuterà i casi solo fino a quando uno dei due è vero. Non penso ci sia alcun vantaggio per un altro approccio. –

risposta

19

è possibile utilizzare la funzione SIGN come

DECLARE @a INT 
SET @a = 0 

SELECT CASE SIGN(@a - 3) 
     WHEN -1 THEN 0 
     WHEN 0 THEN 1 
     WHEN 1 THEN 2 
     END 

Se @a è minore di 3, poi @a - 3 risultati in un int negativo, in cui ritorna SIGN -1.

Se @a è 3 o superiore, allora SIGN restituisce 0 o 1, rispettivamente.


Se l'output che si desidera è 0, 1 e 2, quindi è possibile semplificare ancora di più:

DECLARE @a INT 
SET @a = 0 

SELECT SIGN(@a - 3) + 1 
+0

Grazie, darò questo risultato – Greg

+0

Non riesco a vedere come questo è più mantenibile. Chiunque conosca SQl troverà la dichiarazione originale che l'OP non ha gradito ma che funziona per essere più chiara. – HLGEM

+0

@HLGEM Sarei d'accordo con te anche se '@ a' era solo un'espressione semplice, ma secondo OP,' @ a' è un'espressione lunga e complicata che non vuole vedere ripetuta tre volte in un'istruzione case. Quindi, credo che la soluzione mia o di Andriy M sia appropriata per risolvere il suo problema. –

6

Utilizzando SIGN come suggested by @Jose Rui Santos sembra una bella soluzione. Un'alternativa potrebbe essere quella di assegnare l'espressione un alias, utilizzare una selezione secondaria e testare l'espressione (utilizzando il suo alias) nella esterno prescelto:

SELECT 
    …, 
    CASE 
    WHEN expr < 3 THEN … 
    WHEN expr > 3 THEN … 
    END AS … 
FROM (
    SELECT 
    …, 
    a complex expression AS expr 
    FROM … 
    … 
) 
1
SELECT 
CASE 
WHEN ColumnName >=1 and ColumnName <=1 THEN 'Fail' 
WHEN ColumnName >=6 THEN 'Pass' 
ELSE 'Test' 
END 
FROM TableName 
+0

la domanda originale era come faccio a ottenere che la condizione non appaia su ogni linea. Questo in realtà non risponde alla domanda poiché dovrei ancora ripetere l'equazione su 2 delle righe e assumere il resto – Greg

+0

Non posso revocarlo perché non risolve necessariamente la domanda originale, ma ha risolto il mio problema. Grazie. Serve solo per spostare ColumnName dalla riga "CASE" a ciascuna delle righe "WHEN". – Ads

Problemi correlati