Utilizzo ISNULL con campi di database null
-
12-11-2019 - |
Domanda
Sto cercando di fare qualcosa che dovrebbe essere abbastanza semplice, ma non sta facendo quello che pensavo sarebbe stato.
Fondamentalmente ho una procedura memorizzata e mi aspetto che Param1 o Param2 abbiano un valore di corrispondenza nella mia tabella.
SELECT * FROM MyTable WITH (NOLOCK)
WHERE
field1 = ISNULL(@PARAM1 ,field1 )
AND
field2 = @PARAM2
Funziona bene fino a quando non ho campi nulli nella mia riga, quindi esclude questi risultati. Esiste un metodo diverso che può soddisfare questo?
Soluzione
IsNull sostituisce il primo valore con il secondo valore, quindi solo se il parametro @param1 è null lo sostituisce con param1. Presumo che tu non stia passando valori nulli, quindi probabilmente non è quello che vuoi. Più probabilmente vuoi solo dire
WHERE
(Field1 = @PARAM1 OR Field1 IS NULL)
AND
Field2 = @Param2
Suppongo che potresti usare IsNull anche in questo modo:
ISNULL(Field1, @PARAM1) = @PARAM1
Altri suggerimenti
Null è speciale in SQL. Se si esegue qualche confronto su una colonna, verrà escluso qualsiasi riga che ha un null per quella colonna.
SELECT * FROM MyTable WITH (NOLOCK)
WHERE
(PARAM1 = @PARAM1 or PARAM1 is null)
AND
(PARAM2 = @PARAM2 or PARAM2 is null)
Uso
field1 = ISNULL(@PARAM1, A_REPLACEMENT_VALUE_IF_PARAM1_IS_NULL)
Questo valuterà a-
field1 = @param1 se @param1 non è nullo.
field1 = a_replacement_value_if_param1_is_null if @param1 È ZERO
MODIFICARE:
Prova questi:
--If you want to ignore the WHERE clause if PARAM1/2 is null
ISNULL(field1, DEFAULT_VALUE) = ISNULL(@PARAM1, ISNULL(field1, DEFAULT_VALUE))
OR
ISNULL(field2, DEFAULT_VALUE) = ISNULL(@PARAM2, ISNULL(field2, DEFAULT_VALUE))
O
--To get all rows with field1/2 as PARAM1/2 and ignore everything else
field1 = @PARAM1 OR field2 = @PARAM2