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

Foi útil?

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:

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top