ONDE ESTÁ NULL, não é nulo ou nenhuma cláusula dependendo do valor do parâmetro SQL Server

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

  •  03-07-2019
  •  | 
  •  

Pergunta

Eu tenho um procedimento armazenado no SQL Server 2000 que executa uma pesquisa com base em valores de parâmetros. Para um dos parâmetros passados, eu preciso de uma cláusula WHERE diferente dependendo de seu valor - o problema é que os 3 valores seria onde MyColumn

  1. IS NULL
  2. IS NOT NULL
  3. ANY VALUE (NULL AND NOT NULL) (essencialmente nenhuma cláusula WHERE)

Eu estou tendo algum bloqueio mental na vinda acima com a sintaxe correta. Isso é possível para fazer em um instrução SELECT sem a realização de alguns ramificação IF @parameter BEGIN ... END?

Foi útil?

Solução

Aqui está como você pode resolver isso usando uma única cláusula WHERE:

WHERE (@myParm = value1 AND MyColumn IS NULL)
OR  (@myParm = value2 AND MyColumn IS NOT NULL)
OR  (@myParm = value3)

Um uso ingênuo da instrução CASE não trabalho , por isto quero dizer o seguinte:

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

É possível resolver este usando uma instrução caso, ver de onedaywhen resposta

Outras dicas

Você poderia apenas fazer algo como isto:

SELECT *
FROM foo
WHERE (@param = 0 AND MyColumn IS NULL)
OR (@param = 1 AND MyColumn IS NOT NULL)
OR (@param = 2)

Algo assim.

Esta é a forma como isso pode ser feito 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, ele irá comparar MyColumn para si, ignorando @value = no where cláusula.

  • Se @value tem um valor (NOT NULL) ele irá comparar MyColumn para @value.

Referência: COALESCE (Transact-SQL) .

Uma outra forma de 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

Eu tive sucesso com esta solução. É quase como Patrick, com uma pequena torção. Você pode usar essas expressões separadamente ou em sequência. Se o parâmetro estiver em branco, ele será ignorado e todos os valores para a coluna que sua busca serão exibidos, incluindo 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 = '')
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top