consulta SQL - true => true, false => true ou false
-
20-08-2019 - |
Pergunta
consulta simples, possivelmente impossível, mas eu sei que há algumas pessoas inteligentes lá fora:)
Dado um parâmetro booleano, quero definir meu onde cláusula para qualquer limite de saída de uma determinada coluna -. Ou não fazer nada
Assim, dado @bit parâmetro = 1 este seria o resultado:
onde a coluna 1 =
dada @bit parâmetro = 0 este seria o resultado:
em coluna = 1 ou 0
i. não têm efeito / mostrar todos os resultados (coluna é um campo bit)
Eu não estou querendo sql dinâmico -. I pode se contentar com a fixação deste em código, mas eu só queria saber se há alguma magia inteligente que faria o acima puro e simples
Existe? Eu estou usando o sql server.
aplausos: D
Solução
O column = 1 or @bit = 0
resposta funciona se coluna só pode ser 0 ou 1. Se a coluna pode ser qualquer valor que você deseja:. column = 1 or @bit = 0 and column = 0
Outras dicas
SELECT *
FROM mytable
WHERE column = 1 OR @bit = 0
Se você tiver um índice em column1
, este será mais eficiente:
SELECT *
FROM mytable
WHERE column = 1 AND @bit = 1
UNION ALL
SELECT *
FROM mytable
WHERE @bit = 0
Veja este artigo no meu blog para comparação de um único WHERE
condição UNION ALL
vs. desempenho:
- IN SQL Server : com uma lista separada por vírgulas
where column BETWEEN @bit AND 1
select *
from MyTable
where (@bit = 0 OR MyColumn = 1)
select ...
from [table]
where @bit = 0 or (column = @bit)
Eu tinha vindo acima com uma resposta diferente e senti mudo ao ver a resposta de consenso. Assim, apenas para yucks, em comparação os dois usando o meu próprio banco de dados. Eu realmente não sei se eles são realmente comparáveis, mas meus planos de execução dar uma ligeira vantagem para a minha resposta pateta:
selecione *
de MyTable
onde coluna <> caso @bit quando um 0, em seguida, outra extremidade -1
Eu percebo índices, tamanho da tabela, etc. podem afetar isso.
Além disso, percebi que você provavelmente não pode comparar um pouco para um -1 ...
Só pensei que eu iria partilhar.
Tente este
select ...
from table
where column = case when @bit = 0 then 0 else column end
isso funciona não importa o que o tipo de dados da coluna é (pode até ser uma string, por exemplo). Se fosse, é claro, seria um valor padrão diferente (não 0)
ONDE coluna> = @bit
No entanto, isso só funciona para> 0 valores em uma coluna numérica. @bit serão lançados implicitamente int, smallint etc por causa do tipo de dados precedência.