SQL condicional Onde

votos
8

Eu tenho um procedimento chamado spGetOrders armazenados que aceita alguns parâmetros: @startdate e @EndDate. Esta consulta uma tabela Pedidos. Uma das colunas na tabela é chamado de ClosedDate. Esta coluna irá realizar NULL se uma ordem não tenha sido fechado ou um valor de data se tem. Eu gostaria de adicionar um parâmetro @Closed que terá um valor bit. Em um mundo simples, eu seria capaz de fazer ..

select * from orders o
where o.orderdate between @startdate AND @enddate
and (if @Closed = 1 then o.ClosedDate IS NULL else o.ClosedDate IS NOT NULL)

Obviamente, isso não vai funcionar .. Eu também estou olhando para sql dinâmico que é o meu último recurso, mas começando a parecer a resposta ..

Por favor ajude..

Publicado 09/12/2008 em 17:42
fonte usuário
Em outras línguas...                            


4 respostas

votos
14

Tente isto:

select * from orders o
where o.orderdate between @startdate AND @enddate
and ((@Closed = 1 And o.ClosedDate IS NULL) Or (@Closed = 0 And o.ClosedDate IS NOT NULL))

Ser variam cuidadoso sobre mistura e da AND ou de na cláusula onde. Ao fazer isso, o parêntese para controlar a ordem de avaliação é muito importante.

Respondeu 09/12/2008 em 17:48
fonte usuário

votos
2

Declaração de SQL:

SELECT *  
FROM orders  
WHERE orderdate BETWEEN @startdate AND @enddate  
AND (@Closed = 1 OR CLosedDate IS NOT NULL)
Respondeu 09/12/2008 em 17:46
fonte usuário

votos
0

Basicamente, escrevê-lo.

select * from orders o
where o.orderdate between @startdate AND @enddate
and ((@Closed = 1 and o.ClosedDate IS NULL)
    or (@Closed != 1 and o.ClosedDate IS NOT NULL))

dupla, pode ser removido

Respondeu 09/12/2008 em 17:50
fonte usuário

votos
0

Ou isto:

select * from orders o
where o.orderdate between @startdate AND @enddate
and (  (@Closed = 1 AND o.ClosedDate IS NULL)
     OR (ISNULL(@Closed, 0) <> 1 AND o.ClosedDate IS NOT NULL)
     )

Parece que você quer todas as ordens entre duas datas que têm informações Fechar inconsistente. As outras sugestões são provavelmente tão boa (ou melhor), mas eu tenho certeza que isso funciona e é legível para mim (a maioria das outras sugestões apareceu como eu estava escrevendo).

Boa sorte!

Respondeu 09/12/2008 em 17:48
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more