webentwicklung-frage-antwort-db.com.de

ist es möglich, EXISTS direkt als Bit auszuwählen?

Ich habe mich gefragt, ob es möglich ist, so etwas zu tun (was nicht funktioniert):

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

Scheint, als ob es machbar sein sollte, aber viele Dinge, die in SQL funktionieren sollten, funktionieren nicht;) Ich habe Problemumgehungen dafür gesehen (SELECT 1, wo ... existiert ...), aber es scheint, als ob ich in der Lage sein sollte, einfach Wirf das Ergebnis der Exists-Funktion als ein Bit und mache es damit.

166
jcollum

Nein, Sie müssen eine Problemumgehung verwenden. 

Wenn Sie ein bedingtes Bit 0/1 zurückgeben müssen, können Sie folgendermaßen vorgehen:

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

Oder ohne die Besetzung:

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%'

Wenn du zu wenig zählst

  • 0 -> 0
  • alles andere -> 1
  • Und NULL -> NULL natürlich, aber Sie können NULL mit COUNT (*) nicht ohne GROUP BY erhalten

bit ist in .net-Datentypen direkt boolean zugeordnet, auch wenn es nicht wirklich ...

Dies sieht ähnlich aus, gibt aber keine Zeile (nicht Null) aus, wenn keine Übereinstimmungen vorhanden sind. Es ist also nicht dasselbe 

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

Ich bin etwas spät dran bei der Übernahme; stolperte gerade über den Pfosten. Hier ist jedoch eine Lösung, die effizienter und übersichtlicher ist als die ausgewählte Antwort, jedoch die gleiche Funktionalität bieten sollte:

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

Sie können IIF und CAST verwenden.

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

Sie können auch Folgendes tun:

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

Wenn keine Werte vorhanden sind, die mit 'theValue' beginnen, wird jedoch ein Wert von null (keine Datensätze) zurückgegeben, jedoch kein Bit 0

4
Nelson

Nein, das ist nicht möglich. Der Bitdatentyp ist kein boolescher Datentyp. Es ist ein ganzzahliger Datentyp, der 0,1 oder NULL sein kann.

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

Eine andere Lösung ist die Verwendung von ISNULL in Kombination mit SELECT TOP 1 1:

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