¿Es posible seleccionar EXISTE directamente como un bit?

186

Me preguntaba si es posible hacer algo como esto (que no funciona):

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

Parece que debería ser factible, pero muchas cosas que deberían funcionar en SQL no lo hacen;) He visto soluciones para esto (SELECCIONE 1 donde ... Existe ...) pero parece que debería poder simplemente emitir el resultado de la función existente como un bit y terminar con ello.

jcollum
fuente

Respuestas:

267

No, tendrá que usar una solución alternativa.

Si debe devolver un bit condicional 0/1, otra forma es:

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

O sin el elenco:

SELECT
   CASE
       WHEN EXISTS( SELECT 1 FROM theTable WHERE theColumn LIKE 'theValue%' )
            THEN 1 
       ELSE 0 
   END
Alex K.
fuente
16
No necesita la conversión si está almacenando el resultado en un tipo de datos Bit porque la conversión ya está implícita.
MikeTeeVee
3
Acabo de probar esta técnica, funciona muy bien. CAST to BIT no es necesario para recuperar los resultados de la consulta, probados con SQL Server 2008 R2.
Tore Aurstad
En mi caso, el elenco DEBE ser eliminado
Sérgio S. Filho
51
SELECT CAST(COUNT(*) AS bit) FROM MyTable WHERE theColumn like 'theValue%'

Cuando lanzas a bit

  • 0 -> 0
  • todo lo demás -> 1
  • Y NULL -> NULL, por supuesto, pero no puede obtener NULL con COUNT (*) sin GROUP BY

bitse asigna directamente a booleantipos de datos en .net, incluso si no es realmente ...

Esto se ve similar pero no da fila (no cero) si no coincide, por lo que no es lo mismo

SELECT TOP 1 CAST(NumberKeyCOlumn AS bit) FROM MyTable WHERE theColumn like 'theValue%'
gbn
fuente
44
Pero esto no usa EXISTA en absoluto. No estaba preguntando cómo solucionarlo, puedo encontrar soluciones alternativas, estaba preguntando si existía algún truco para usar existe como un bit del que no estaba al tanto.
jcollum
66
Esta no es una solución alternativa, es una forma correcta de configurar. EXISTE es esta solución ... Y muy limpio, ¿no?
gbn
1
@jcollum: sí, o algo así. EXISTE es casi siempre SI EXISTE o DONDE EXISTE y no se usa para la salida como está tratando de hacer
gbn
14
EXISTS es más eficiente que COUNT cuando se verifica la existencia de un registro - vea sqlblog.com/blogs/andrew_kelly/archive/2007/12/15/…
Tahir Hassan
9
A diferencia EXISTS, COUNTseguirá buscando en los datos filas coincidentes incluso después de encontrar la primera porque necesita contar.
IsmailS
11

Llego un poco tarde a la aceptación de esto; simplemente tropecé con la publicación. Sin embargo, aquí hay una solución que es más eficiente y ordenada que la respuesta seleccionada, pero debería ofrecer la misma funcionalidad:

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
fuente
7

Puedes usar IIFyCAST

SELECT CAST(IIF(EXISTS(SELECT * FROM theTable 
                       where theColumn like 'theValue%'), 1, 0) AS BIT)
Jaider
fuente
1
Me gusta esto, pero solo funciona en SQL Server 2012 y versiones posteriores. Parece que se agregó IIF en 2012
ja928
5

También puedes hacer lo siguiente:

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

Si no hay valores que comiencen con 'theValue', esto devolverá un valor nulo (sin registros) en lugar de un bit 0

Nelson
fuente
2

No, no es posible. El tipo de datos de bit no es un tipo de datos booleanos. Es un tipo de datos entero que puede ser 0,1 o NULL.

Martin Smith
fuente
3
@bzlm Sí, puede en SQLServer durante más de 10 años. SQL Server 7.0 lo presentó msdn.microsoft.com/en-us/library/aa237157%28SQL.80%29.aspx
Martin Smith
44
@bzlm: me parece que te estás aferrando a las pajillas y realmente no sabes nada sobre los tipos de datos de SQL Server. La definición de bit en SQL Server es "Un tipo de datos entero que puede tomar un valor de 1, 0 o NULL". msdn.microsoft.com/en-us/library/ms177603.aspx . Esto se aplica a las columnas y a las variables de Transact SQL. En ninguna parte se puede usar una variable de bit como booleano en SQL, IF(@TRUE)por ejemplo, ni viceversa, se puede convertir una expresión booleana en un bit. (Con, por ejemplo SET @BitVariable = (1=1))
Martin Smith
1
Veo a dónde vas, pero el casting no fue tanto el problema como la posibilidad de seleccionar EXISTE directamente.
jcollum
1

Otra solución es usar ISNULLen conjunto con SELECT TOP 1 1:

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

Creo que existe solo se puede usar en una cláusula where, por lo que tendrá que hacer una solución (o una subconsulta con existe como la cláusula where). No sé si eso cuenta como una solución alternativa.

¿Qué hay de esto?

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
fuente
¿Qué pasa con el caso cuando en un selecto?
bajo
-1
SELECT IIF(EXISTS(SELECT * FROM theTable WHERE theColumn LIKE 'theValue%'), 1, 0)
MEC
fuente