Como retornar um valor booleano na instrução SQL Select?
Eu tentei este código:
SELECT CAST(1 AS BIT) AS Expr1
FROM [User]
WHERE (UserID = 20070022)
E ele só retorna TRUE
se UserID
existir na mesa. Quero que ele retorne FALSE
se UserID
não existir na mesa.
SELECT WHEN CAST(1 AS BIT) THEN 'YES' END AS result
- resulta em um erro, ouCAST(1 AS BIT)
seja, não é o mesmo VERDADEIRO lógico.Respostas:
O que você tem lá não retornará nenhuma linha se o usuário não existir. Aqui está o que você precisa:
fonte
1
vez de*
.*
são mais idiomáticos. Veja esta pergunta .AS bool
parte é muito importante):CAST( CASE WHEN EXISTS ( SELECT * FROM mytable WHERE mytable.id = 1) THEN TRUE ELSE FALSE END AS bool) AS nameofmycolumn
Possivelmente algo nesse sentido:
http://sqlfiddle.com/#!3/5e555/1
fonte
Dado que, geralmente ,
1 = true
e0 = false
tudo o que você precisa fazer é contar o número de linhas e converter para umboolean
.Portanto, seu código publicado precisa apenas de uma
COUNT()
função adicionada:fonte
Exists(
teste é muito mais rápido do que fazer umCount(1)
teste em tabelas com grande número de linhas.UserID
estiver indexada (ou é mesmo a PK), certamente você estará indo diretamente para a única linha que existe (ou não).Use 'Exists', que retorna 0 ou 1.
A consulta será como:
fonte
Se count (*) = 0 retorna false. Se count (*)> 0 retornar verdadeiro.
fonte
Eu faço assim:
Visto que um booleano nunca pode ser nulo (pelo menos no .NET), ele deve ser padronizado como false ou você pode configurá-lo como esse se for o padrão true. No entanto, 1 = verdadeiro, então nulo = falso e sem sintaxe extra.
Nota: Eu uso o Dapper como minha micro orm, eu imagino que o ADO funcione da mesma forma.
fonte
Observe outro problema equivalente: Criando uma consulta SQL que retorne (1) se a condição for atendida e um resultado vazio caso contrário. Observe que uma solução para esse problema é mais geral e pode ser facilmente usada com as respostas acima para obter a pergunta que você fez. Como esse problema é mais geral, estou provando sua solução, além das belas soluções apresentadas acima para o seu problema.
fonte
Para aqueles que estão interessados em obter o valor adicionando um nome de coluna personalizado, isso funcionou para mim:
Você pode pular as aspas duplas do nome da coluna caso não esteja interessado em manter a distinção entre maiúsculas e minúsculas do nome (em alguns clientes).
Ajustei levemente a resposta de @ Chad para isso.
fonte
O valor booleano inicialmente isAvailable é definido como 0
fonte