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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top