2010-05-03 5 views
144

Je me demandais s'il est possible de faire quelque chose comme ça (ce qui ne fonctionne pas):est-il possible de sélectionner EXISTS directement comme un bit?

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

On dirait que ce devrait être faisable, mais beaucoup de choses qui devraient fonctionner dans SQL ne le font pas; J'ai vu des solutions de contournement pour cela (SELECT 1 où ... Existe ...) mais il semble que je devrais être capable de simplement lancer le résultat de la fonction exists comme un peu et en avoir fini avec.

Répondre

208

Non, vous devez utiliser une solution de contournement.

Si vous devez retourner un peu conditionnel 0/1 est une autre façon à:

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

Vous n'avez pas besoin de la distribution si vous stockez le résultat dans un Type de données Bit car la distribution est déjà implicite. – MikeTeeVee

+1

Juste testé cette technique, fonctionne très bien. Le CAST à BIT n'est pas nécessaire pour récupérer les résultats de la requête, testé avec SQL Server 2008 R2. –

+0

Dans mon cas, la distribution a DOIT être retirée –

2

Non ce n'est pas possible. Le type de données bit n'est pas un type de données booléen. C'est un type de données entier qui peut être 0,1 ou NULL.

+0

Un peu ne peut pas être nulle. :) – bzlm

+2

@bzlm Oui, il peut dans SQLServer depuis plus de 10 ans. SQL Server 7.0 l'a introduit http://msdn.microsoft.com/en-us/library/aa237157%28SQL.80%29.aspx –

+3

@bzlm - On dirait que vous vous cramponnez à des pailles et que vous ne savez rien sur les types de données SQL Server. La définition de bit dans SQL Server est "Un type de données entier qui peut prendre une valeur de 1, 0 ou NULL". http://msdn.microsoft.com/en-us/library/ms177603.aspx. Cela s'applique aux colonnes et aux variables Transact SQL. Nulle part une variable binaire ne peut être utilisée comme un booléen en SQL avec 'IF (@TRUE)' par exemple, et vice versa, une expression booléenne peut être convertie en un bit. (Avec par exemple 'SET @BitVariable = (1 = 1)') –

41
SELECT CAST(COUNT(*) AS bit) FROM MyTable WHERE theColumn like 'theValue%' 

Quand vous lancez à peu

  • 0 -> 0
  • tout le reste -> 1
  • Et NULL -> NULL bien sûr, mais vous ne pouvez pas obtenir NULL avec COUNT (*) sans GROUP BY

bit cartes directement à boolean dans .net types de données, même si ce n'est pas vraiment ...

Cela ressemble mais donne aucune ligne (zéro) si aucune correspondance, il est donc pas le même

SELECT TOP 1 CAST(NumberKeyCOlumn AS bit) FROM MyTable WHERE theColumn like 'theValue%' 
+3

Mais cela n'utilise pas EXISTS du tout. Je ne demandais pas comment contourner le problème, je peux trouver des solutions de contournement, je demandais s'il y avait un truc à utiliser existe en tant que bit dont je n'étais pas au courant. – jcollum

+5

Il ne s'agit pas d'une solution de contournement, mais plutôt d'une méthode correcte. EXISTS est cette solution de contournement ... Et très propre, non? – gbn

+0

Donc, vous dites à la place de EXISTS je devrais utiliser cette requête? Si oui, alors oui, c'est une solution de contournement. – jcollum

-1

Je crois existe ne peut être utilisé dans une clause where, de sorte que vous aurez à faire une solution de contournement (ou une sous-requête avec exists comme clause where). Je ne sais pas si cela compte comme une solution de contournement.

Qu'en est-ce:

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 
+0

Qu'en est-il des cas dans un select? – lowerkey

4

Vous pouvez également effectuer les opérations suivantes:

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

S'il n'y a pas de valeurs commençant par 'theValue' cela return null (aucun enregistrement) au lieu d'un bit 0 si

9

Je suis un peu en retard sur l'acceptation pour cela; juste trébuché sur le poteau. Cependant, voici une solution qui est plus efficace & propre que la réponse choisie, mais doit donner les mêmes fonctionnalités:

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 
4

Vous pouvez utiliser IIF et CAST

SELECT CAST(IIF(EXISTS(SELECT * FROM theTable 
         where theColumn like 'theValue%'), 1, 0) AS BIT) 
+0

J'aime ça, mais cela ne fonctionne que dans SQL Server 2012 et plus. On dirait que IIF a été ajouté en 2012 – ja928

0
SELECT IIF(EXISTS(SELECT * FROM theTable WHERE theColumn LIKE 'theValue%'), 1, 0)