web-dev-qa-db-fra.com

est-il possible de sélectionner directement EXISTS en tant que bit?

Je me demandais s'il était possible de faire quelque chose comme ça (qui ne marche pas):

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

On dirait que cela devrait être faisable, mais beaucoup de choses qui devraient fonctionner en SQL ne le font pas;) J'ai déjà vu des solutions de contournement (SELECT 1 où ... existe ...), mais il me semble que je devrais pouvoir transformez le résultat de la fonction exist en un bit et faites-le avec.

166
jcollum

Non, vous devrez utiliser une solution de contournement. 

Si vous devez renvoyer un bit conditionnel 0/1, vous pouvez également:

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

Ou sans le casting:

SELECT
   CASE
       WHEN EXISTS( SELECT 1 FROM theTable WHERE theColumn LIKE 'theValue%' )
            THEN 1 
       ELSE 0 
   END
242
Alex K.
SELECT CAST(COUNT(*) AS bit) FROM MyTable WHERE theColumn like 'theValue%'

Quand vous lancez pour mordre

  • 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 mappe directement à boolean dans les types de données .net, même si ce n'est pas vraiment ...

Cela semble similaire mais ne donne aucune ligne (pas zéro) s'il n'y a pas de correspondance, donc ce n'est pas la même chose 

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

Je suis un peu en retard sur la reprise pour cela; vient de trébucher sur le poste. Cependant, voici une solution plus efficace et plus nette que la réponse choisie, mais qui devrait offrir 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
9
JohnLBevan

Vous pouvez utiliser IIF et CAST

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

Vous pouvez également faire ce qui suit:

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

S'il n'y a pas de valeurs commençant par 'theValue', cela retournera null (pas d'enregistrements) plutôt qu'un bit 0 si

4
Nelson

Non ce n'est pas possible. Le type de données bit n'est pas un type de données booléen. Il s'agit d'un type de données entier pouvant être égal à 0,1 ou à NULL.

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

Une autre solution consiste à utiliser ISNULL en tandem avec SELECT TOP 1 1:

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