WHERE IS NULL, IS NOT NULL o NO WHERE clausola a seconda del valore del parametro SQL Server

StackOverflow https://stackoverflow.com/questions/810714

  •  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

  1. È NULL
  2. NON È NULL
  3. QUALSIASI VALORE (NULL AND NOT NULL) (essenzialmente nessuna clausola WHERE )

Sto avendo qualche blocco mentale nel trovare la sintassi corretta. È possibile farlo in un'istruzione select senza eseguire alcune ramificazioni IF @parameter BEGIN ... END ?

È stato utile?

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