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.