é possível selecionar EXISTS diretamente um pouco?

186

Eu queria saber se é possível fazer algo assim (o que não funciona):

select cast( (exists(select * from theTable where theColumn like 'theValue%') as bit)

Parece que deve ser possível, mas muitas coisas que devem funcionar no SQL não;) Eu já vi soluções alternativas para isso (SELECT 1, onde ... existe ...), mas parece que eu deveria ser capaz de lance o resultado da função existente um pouco e termine com ela.

jcollum
fonte

Respostas:

267

Não, você precisará usar uma solução alternativa.

Se você deve retornar um bit condicional 0/1, outra maneira é:

SELECT CAST(
   CASE WHEN EXISTS(SELECT * FROM theTable where theColumn like 'theValue%') THEN 1 
   ELSE 0 
   END 
AS BIT)

Ou sem o elenco:

SELECT
   CASE
       WHEN EXISTS( SELECT 1 FROM theTable WHERE theColumn LIKE 'theValue%' )
            THEN 1 
       ELSE 0 
   END
Alex K.
fonte
16
Você não precisa da conversão se estiver armazenando o resultado em um tipo de dados Bit, porque a conversão já está implícita.
MikeTeeVee
3
Acabei de testar essa técnica, funciona muito bem. O CAST para BIT não é necessário para recuperar os resultados da consulta, testada com o SQL Server 2008 R2.
Tore Aurstad
No meu caso o elenco que deve ser removido
Sérgio S. Filho
51
SELECT CAST(COUNT(*) AS bit) FROM MyTable WHERE theColumn like 'theValue%'

Quando você joga em bit

  • 0 -> 0
  • tudo o resto -> 1
  • E NULL -> NULL, é claro, mas você não pode obter NULL com COUNT (*) sem um GROUP BY

bit mapeia diretamente para boolean tipos de dados .net, mesmo que não seja realmente ...

Parece semelhante, mas não dá linha (não zero) se não houver correspondências, portanto, não é o mesmo

SELECT TOP 1 CAST(NumberKeyCOlumn AS bit) FROM MyTable WHERE theColumn like 'theValue%'
gbn
fonte
4
Mas isso não usa EXISTS. Eu não estava perguntando como solucionar o problema, posso encontrar soluções alternativas, estava perguntando se havia algum truque para usar, existe um pouco do qual eu não estava ciente.
Jcollum
6
Esta não é uma solução alternativa, é uma maneira correta em termos de configuração. EXISTE é esta solução alternativa ... E muito limpa, não?
gbn
1
@ jcollum: sim, ou algo assim. EXISTE é quase sempre SE EXISTE ou exista e não usado para a saída como você está tentando fazer
GBN
14
EXISTE é mais eficiente do que COUNT durante a verificação de existência de um registro - veja sqlblog.com/blogs/andrew_kelly/archive/2007/12/15/...
Tahir Hassan
9
Ao contrário EXISTS, COUNTcontinuará procurando nos dados por linhas correspondentes, mesmo depois de encontrar a primeira porque precisa obter contagem.
Ismails
11

Estou um pouco atrasado para isso; apenas tropeçou no post. No entanto, aqui está uma solução que é mais eficiente e elegante do que a resposta selecionada, mas deve oferecer a mesma funcionalidade:

declare @t table (name nvarchar(16))
declare @b bit

insert @t select N'Simon Byorg' union select N'Roe Bott'


select @b = isnull((select top 1 1 from @t where name = N'Simon Byorg'),0)
select @b whenTrue

select @b = isnull((select top 1 1 from @t where name = N'Anne Droid'),0)
select @b whenFalse
JohnLBevan
fonte
7

Você pode usar IIFeCAST

SELECT CAST(IIF(EXISTS(SELECT * FROM theTable 
                       where theColumn like 'theValue%'), 1, 0) AS BIT)
Jaider
fonte
1
Eu gosto disso, mas ele funciona apenas no SQL Server 2012 e superior. Parece que o IIF foi adicionado em 2012
ja928 13/16
5

Você também pode fazer o seguinte:

SELECT DISTINCT 1
  FROM theTable
 WHERE theColumn LIKE 'theValue%'

Se não houver valores começando com 'theValue', isso retornará nulo (sem registros) em vez de um bit 0

Nelson
fonte
2

Não, não é possível. O tipo de dados bit não é um tipo de dados booleano. É um tipo de dados inteiro que pode ser 0,1 ou NULL.

Martin Smith
fonte
3
@bzlm Sim, ele pode no SQLServer há mais de 10 anos. O SQL Server 7.0 o introduziu msdn.microsoft.com/en-us/library/aa237157%28SQL.80%29.aspx
Martin Smith
4
@ bzlm - Parece que você está agarrado a palhinhas e realmente não sabe nada sobre os tipos de dados do SQL Server para mim. A definição de bit no SQL Server é "Um tipo de dados inteiro que pode assumir o valor 1, 0 ou NULL". msdn.microsoft.com/en-us/library/ms177603.aspx . Isso se aplica a colunas e variáveis ​​Transact SQL. Em nenhum lugar uma variável de bit pode ser usada como booleana no SQL, IF(@TRUE)por exemplo, nem vice-versa, uma expressão booleana pode ser coagida em um bit. (With eg SET @BitVariable = (1=1))
Martin Smith
1
Vejo para onde você está indo, mas a conversão para bits não foi tanto o problema quanto a possibilidade de selecionar EXISTS diretamente.
Jcollum
1

Outra solução é usar ISNULLem conjunto com SELECT TOP 1 1:

SELECT ISNULL((SELECT TOP 1 1 FROM theTable where theColumn like 'theValue%'), 0)
anar khalilov
fonte
-1

Acredito que exista só pode ser usado em uma cláusula where, portanto, você precisará executar uma solução alternativa (ou uma subconsulta existe como a cláusula where). Não sei se isso conta como uma solução alternativa.

Que tal isso:

create table table1 (col1   int null)
go
select 'no items',CONVERT(bit, (select COUNT(*) from table1) )   -- returns 'no items', 0
go
insert into table1 (col1) values (1)
go
select '1 item',CONVERT(bit, (select COUNT(*) from table1) )     --returns '1 item', 1
go
insert into table1 (col1) values (2)
go
select '2 items',CONVERT(bit, (select COUNT(*) from table1) )    --returns '2 items', 1
go
insert into table1 (col1) values (3)
go
drop table table1
go
ScottK
fonte
E o caso whens em um select?
Lowerkey
-1
SELECT IIF(EXISTS(SELECT * FROM theTable WHERE theColumn LIKE 'theValue%'), 1, 0)
MEC
fonte