WHERE IS NULL, IS NOT NULL o NO WHERE clausola a seconda del valore del parametro SQL Server
-
03-07-2019 - |
Domanda
Ho una procedura memorizzata in SQL Server 2000 che esegue una ricerca in base ai valori dei parametri. Per uno dei parametri passati, ho bisogno di una diversa clausola DOVE
a seconda del suo valore - il problema è che i 3 valori sarebbero dove MyColumn
-
È NULL
-
NON È NULL
-
QUALSIASI VALORE (NULL AND NOT NULL)
(essenzialmente nessuna clausolaWHERE
)
Sto avendo qualche blocco mentale nel trovare la sintassi corretta. È possibile farlo in un'istruzione select senza eseguire alcune ramificazioni IF @parameter BEGIN ... END
?
Soluzione
Ecco come puoi risolverlo usando una singola clausola WHERE
:
WHERE (@myParm = value1 AND MyColumn IS NULL)
OR (@myParm = value2 AND MyColumn IS NOT NULL)
OR (@myParm = value3)
Un uso ingenuo dell'istruzione CASE non funziona , con questo intendo quanto segue:
SELECT Field1, Field2 FROM MyTable
WHERE CASE @myParam
WHEN value1 THEN MyColumn IS NULL
WHEN value2 THEN MyColumn IS NOT NULL
WHEN value3 THEN TRUE
END
È possibile risolvere questo problema usando un'istruzione case, vedere la risposta di onedaywhen
Altri suggerimenti
Potresti semplicemente fare qualcosa del genere:
SELECT *
FROM foo
WHERE (@param = 0 AND MyColumn IS NULL)
OR (@param = 1 AND MyColumn IS NOT NULL)
OR (@param = 2)
Qualcosa del genere.
Ecco come si può fare usando CASE
:
DECLARE @myParam INT;
SET @myParam = 1;
SELECT *
FROM MyTable
WHERE 'T' = CASE @myParam
WHEN 1 THEN
CASE WHEN MyColumn IS NULL THEN 'T' END
WHEN 2 THEN
CASE WHEN MyColumn IS NOT NULL THEN 'T' END
WHEN 3 THEN 'T' END;
WHERE MyColumn = COALESCE(@value,MyColumn)
-
Se
@value
èNULL
, confronteràMyColumn
con se stesso, ignorando@value = no where
clausola. -
SE
@value
ha un valore (NOT NULL
) confronteràMyColumn
con@value
.
Riferimento : COALESCE (Transact-SQL) .
Un altro modo di CASE:
SELECT *
FROM MyTable
WHERE 1 = CASE WHEN @myParm = value1 AND MyColumn IS NULL THEN 1
WHEN @myParm = value2 AND MyColumn IS NOT NULL THEN 1
WHEN @myParm = value3 THEN 1
END
Ho avuto successo con questa soluzione. È quasi come quello di Patrick, con una piccola svolta. Puoi usare queste espressioni separatamente o in sequenza. Se il parametro è vuoto, verrà ignorato e verranno visualizzati tutti i valori per la colonna in cui verrà visualizzata la ricerca, incluso NULLS.
SELECT * FROM MyTable
WHERE
--check to see if @param1 exists, if @param1 is blank, return all
--records excluding filters below
(Col1 LIKE '%' + @param1 + '%' OR @param1 = '')
AND
--where you want to search multiple columns using the same parameter
--enclose the first 'OR' expression in braces and enclose the entire
--expression
((Col2 LIKE '%' + @searchString + '%' OR Col3 LIKE '%' + @searchString + '%') OR @searchString = '')
AND
--if your search requires a date you could do the following
(Cast(DateCol AS DATE) BETWEEN CAST(@dateParam AS Date) AND CAST(GETDATE() AS DATE) OR @dateParam = '')