EXISTS'i doğrudan bir parça olarak seçmek mümkün müdür?


186

Böyle bir şey yapmanın mümkün olup olmadığını merak ediyordum (ki bu işe yaramaz):

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

Yapılabilir olması gerektiği gibi görünüyor, ancak SQL'de çalışması gereken birçok şey yok;) Bunun için geçici çözümler gördüm (SEÇ 1 burada ... Var ...) ama sadece yapabilmem gerekir gibi görünüyor var olan fonksiyonun sonucunu biraz dökün ve onunla yapın.

Yanıtlar:


267

Hayır, bir geçici çözüm kullanmanız gerekecek.

Koşullu bir bit 0/1 döndürmeniz gerekiyorsa başka bir yol:

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

Veya oyuncu kadrosu olmadan:

SELECT
   CASE
       WHEN EXISTS( SELECT 1 FROM theTable WHERE theColumn LIKE 'theValue%' )
            THEN 1 
       ELSE 0 
   END

16
Sonucu bir Bit veri tipinde saklıyorsanız, oyuncu kadrosuna ihtiyacınız yoktur çünkü oyuncu kadrosu zaten örtüktür.
MikeTeeVee

3
Sadece bu tekniği test etti, harika çalışıyor. CAST to BIT, SQL Server 2008 R2 ile test edilen sorgudan sonuçları almak için gerekli değildir.
Tore Aurstad

Benim durumumda oyuncular SİLİNMELİ GEREKİR
Sérgio S. Filho

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

Biraz oynadığın zaman

  • 0 -> 0
  • her şey -> 1
  • Ve NULL -> NULL elbette, ancak GROUP BY olmadan COUNT (*) ile NULL alamazsınız

bitbooleangerçekten olmasa bile, doğrudan .net veri türlerine eşler ...

Bu benzer görünüyor ancak eşleşme yoksa satır (sıfır değil) vermiyor, bu yüzden aynı değil

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

4
Ancak bu EXISTS'i hiç kullanmaz. Nasıl geçici bir çözüm bulmak istemiyordum, geçici çözümler bulabilirim, bilmediğim bir bit olarak kullanmanın bir yolu olup olmadığını soruyordum.
jcollum

6
Bu geçici bir çözüm değil, akıllıca bir yol. MEVCUT bu geçici çözüm ... Ve çok temiz, değil mi?
gbn

1
@jcollum: evet ya da bunun gibi bir şey. EXISTS neredeyse her zaman EXISTS veya NEREDE VARSA ve yapmaya çalıştığınız gibi çıktı için kullanılmaz
gbn

14
Kayıt olup olmadığını kontrol ederken EXISTS, COUNT değerinden daha verimlidir - bkz. Sqlblog.com/blogs/andrew_kelly/archive/2007/12/15/…
Tahir Hassan

9
Bunun aksine EXISTS, COUNTilkini bulduktan sonra bile eşleşen satırlara ilişkin verilere bakmaya devam edecektir çünkü sayılması gerekir.
IsmailS

11

Bunun için biraz geç kaldım; sadece yazı boyunca tökezledi. Bununla birlikte, seçilen cevaptan daha verimli ve temiz olan ancak aynı işlevselliği vermesi gereken bir çözüm:

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

7

Kullanabilirsiniz IIFveCAST

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

1
Bunu beğendim, ancak yalnızca SQL Server 2012 ve sonraki sürümlerde çalışır. Görünen o ki IIF 2012 yılında eklendi
ja928

5

Ayrıca aşağıdakileri de yapabilirsiniz:

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

'TheValue' ile başlayan değer yoksa, bu 0 biti yerine null (kayıt yok) döndürür


2

Hayır mümkün değil. Bit veri türü, bir boole veri türü değildir. 0,1 veya NULL olabilen bir tamsayı veri türüdür.


3
@bzlm Evet SQLServer'da 10 yılı aşkın bir süredir yapabilir. SQL Server 7.0 bunu tanıttı msdn.microsoft.com/en-us/library/aa237157%28SQL.80%29.aspx
Martin Smith

4
@bzlm - Görünüşe göre payetlere takılıyor ve SQL Server veri türleri hakkında gerçekten hiçbir şey bilmiyorsunuz. SQL Server'daki bit tanımı "1, 0 veya NULL değeri alabilen bir tamsayı veri türüdür." msdn.microsoft.com/en-us/library/ms177603.aspx . Bu sütunlar ve Transact SQL değişkenleri için geçerlidir. Bir bit değişkeni SQL'de bir boolean olarak kullanılamaz, IF(@TRUE)örneğin tam tersi bir boole ifadesi bir bite zorlanamaz. (Örneğin SET @BitVariable = (1=1))
Martin Smith

1
Nereye gittiğinizi görüyorum, ancak bitmek için döküm, doğrudan EXISTS'i seçebilmek kadar önemli değildi.
jcollum

1

Başka bir çözüm kullanmaktır ISNULLtandem SELECT TOP 1 1:

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

-1

Ben var sadece bir nerede yan tümcesinde kullanılabilir inanıyorum , bu yüzden bir geçici çözüm (veya nerede yan tümcesi olarak var olan bir alt sorgu) yapmak zorunda kalacak. Bunun geçici bir çözüm olup olmadığını bilmiyorum.

Peki buna ne dersin:

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

Bir seçimdeki vaka ne durumda?
lowerkey

-1
SELECT IIF(EXISTS(SELECT * FROM theTable WHERE theColumn LIKE 'theValue%'), 1, 0)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.