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

185

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, es einfach zu tun Wirf das Ergebnis der existierenden Funktion als Bit und sei damit fertig.

jcollum
quelle

Antworten:

268

Nein, Sie müssen eine Problemumgehung verwenden.

Wenn Sie ein bedingtes Bit 0/1 zurückgeben müssen, besteht eine andere Möglichkeit darin:

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
Alex K.
quelle
16
Sie benötigen die Umwandlung nicht, wenn Sie das Ergebnis in einem Bit-Datentyp speichern, da die Umwandlung bereits implizit ist.
MikeTeeVee
3
Gerade diese Technik getestet, funktioniert super. Das CAST to BIT ist nicht erforderlich, um die Ergebnisse der mit SQL Server 2008 R2 getesteten Abfrage abzurufen.
Tore Aurstad
In meinem Fall MUSS die Besetzung entfernt werden
Sérgio S. Filho
50
SELECT CAST(COUNT(*) AS bit) FROM MyTable WHERE theColumn like 'theValue%'

Wenn Sie zu Bit werfen

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

bitwird direkt booleanin .net-Datentypen zugeordnet, auch wenn es nicht wirklich ...

Dies sieht ähnlich aus, gibt jedoch keine Zeile (nicht Null), wenn keine Übereinstimmungen vorliegen, sodass es nicht dasselbe ist

SELECT TOP 1 CAST(NumberKeyCOlumn AS bit) FROM MyTable WHERE theColumn like 'theValue%'
gbn
quelle
4
Dies verwendet jedoch überhaupt keine EXISTS. Ich habe nicht gefragt, wie ich es umgehen soll, ich kann Problemumgehungen finden, ich habe gefragt, ob es einen Trick gibt, der als Teil existiert, den ich nicht kannte.
JCollum
6
Dies ist keine Problemumgehung, sondern eine korrekte Methode. EXISTS ist diese Problemumgehung ... Und sehr sauber, nein?
Gbn
1
@jcollum: ja oder so ähnlich. EXISTS ist fast immer IF EXISTS oder WHERE EXISTS und wird nicht für die Ausgabe verwendet, wie Sie es versuchen
gbn
14
EXISTS ist effizienter als COUNT, wenn das Vorhandensein eines Datensatzes überprüft wird - siehe sqlblog.com/blogs/andrew_kelly/archive/2007/12/15/…
Tahir Hassan
9
Im Gegensatz zu EXISTS, COUNThält in den Daten für die passenden Zeilen sucht auch nach dem ersten zu finden , weil es Zahl bekommen muss.
IsmailS
11

Ich bin etwas spät dran; stolperte nur über den Pfosten. Hier ist jedoch eine Lösung, die effizienter und übersichtlicher als die ausgewählte Antwort ist, aber dieselbe 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
JohnLBevan
quelle
7

Sie können IIFund verwendenCAST

SELECT CAST(IIF(EXISTS(SELECT * FROM theTable 
                       where theColumn like 'theValue%'), 1, 0) AS BIT)
Jaider
quelle
1
Ich mag das, aber es funktioniert nur in SQL Server 2012 und höher. Sieht aus wie IIF wurde im Jahr 2012 hinzugefügt
ja928
4

Sie können auch Folgendes tun:

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

Wenn es keine Werte gibt, die mit 'theValue' beginnen, wird null (keine Datensätze) anstelle von Bit 0 zurückgegeben

Nelson
quelle
2

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

Martin Smith
quelle
3
@bzlm Ja, es kann in SQLServer seit weit über 10 Jahren. SQL Server 7.0 führte es ein msdn.microsoft.com/en-us/library/aa237157%28SQL.80%29.aspx
Martin Smith
4
@bzlm - Es hört sich so an, als würden Sie sich an Strohhalme klammern und für mich nichts über SQL Server-Datentypen wissen. Die Definition des Bits in SQL Server lautet "Ein ganzzahliger Datentyp, der den Wert 1, 0 oder NULL annehmen kann." msdn.microsoft.com/en-us/library/ms177603.aspx . Dies gilt für Spalten und Transact SQL-Variablen. Nirgendwo kann beispielsweise eine Bitvariable in SQL als Boolescher Wert verwendet werden, IF(@TRUE)und umgekehrt kann ein Boolescher Ausdruck nicht in ein Bit gezwungen werden. (Mit zB SET @BitVariable = (1=1))
Martin Smith
1
Ich verstehe, wohin du gehst, aber das Casting war weniger das Problem als vielmehr die Möglichkeit, EXISTS direkt auszuwählen.
JCollum
1

Eine andere Lösung ist die Verwendung ISNULLzusammen mit SELECT TOP 1 1:

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

Ich glaube , existiert nur in einer where - Klausel verwendet werden, so dass Sie eine Abhilfe zu tun haben werden (oder eine Unterabfrage mit existieren als where - Klausel). Ich weiß nicht, ob dies als Problemumgehung gilt.

Was ist damit:

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
quelle
Was ist mit Fallwochen in einer Auswahl?
Unterschlüssel
-1
SELECT IIF(EXISTS(SELECT * FROM theTable WHERE theColumn LIKE 'theValue%'), 1, 0)
MEC
quelle