EXISTS를 비트로 직접 선택할 수 있습니까?


186

다음과 같은 작업을 수행 할 수 있는지 궁금합니다.

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

그것은 가능해야하지만 SQL에서 작동 해야하는 많은 것은 그렇지 않습니다.)) 이것에 대한 해결 방법을 보았습니다 (SELECT 1 where ... Exists ...) 존재하는 함수의 결과를 비트로 캐스트하고 완료하십시오.

답변:


267

아니요, 해결 방법을 사용해야합니다.

조건부 비트 0/1을 반환해야하는 경우 다른 방법은 다음과 같습니다.

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

또는 캐스트없이 :

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

16
캐스트는 이미 암시 적이므로 결과를 Bit 데이터 유형으로 저장하는 경우 캐스트가 필요하지 않습니다.
MikeTeeVee 10

3
이 기술을 테스트하여 훌륭하게 작동합니다. SQL Server 2008 R2로 테스트 한 쿼리에서 결과를 검색하는 데 CAST to BIT가 필요하지 않습니다.
Tore Aurstad

제 경우에는 캐스트를 제거해야합니다
Sérgio S. Filho

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

당신이 비트로 캐스팅 할 때

  • 0-> 0
  • 다른 모든 것-> 1
  • 물론 NULL-> NULL이지만 GROUP BY가 없으면 COUNT (*)로 NULL을 얻을 수 없습니다.

bitboolean실제로는 아니지만 .net 데이터 유형으로 직접 매핑됩니다 .

이것은 비슷해 보이지만 일치하는 항목이 없으면 행이 없습니다 (0이 아님).

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

4
그러나 이것은 EXISTS를 전혀 사용하지 않습니다. 나는 그것을 해결하는 방법을 묻지 않았고, 해결책을 찾을 수 있었고, 내가 알지 못하는 비트로 사용하는 데 약간의 트릭이 있는지 묻고있었습니다.
jcollum

6
이것은 해결 방법이 아니며 올바른 설정 방법 중 하나입니다. 존재하는 해결 방법은 ... 매우 깨끗합니다.
gbn

1
@jcollum : 그렇습니다. EXISTS는 EXISTS 또는 WHERE EXISTS 인 경우 거의 항상 존재하며 사용자가 원하는 출력에 사용되지 않습니다
gbn

14
EXISTS는 레코드가 있는지 확인할 때 COUNT보다 효율적입니다. sqlblog.com/blogs/andrew_kelly/archive/2007/12/15/…
Tahir Hassan

9
달리 EXISTS, COUNT이 수를 얻을 필요가 있기 때문에 심지어 첫 번째를 찾은 후 일치하는 행에 대한 데이터를 찾고 유지합니다.
IsmailS

11

나는 이것에 대해 조금 늦었다. 게시물을 우연히 발견했습니다. 그러나 여기에 선택한 답변보다 효율적이고 깔끔하지만 동일한 기능을 제공하는 솔루션이 있습니다.

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

당신이 사용할 수있는 IIFCAST

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

1
나는 이것을 좋아하지만 SQL Server 2012 이상에서만 작동합니다. 2012 년에 IIF가 추가 된 것 같습니다
ja928

5

다음을 수행 할 수도 있습니다.

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

'theValue'로 시작하는 값이 없으면 비트 0이 아닌 null (레코드 없음)을 반환합니다.


2

불가능합니다. 비트 데이터 형식이 부울 데이터 형식이 아닙니다. 0,1 또는 NULL 일 수있는 정수 데이터 유형입니다.


3
@bzlm 예, 10 년 이상 SQLServer에서 가능합니다. SQL Server 7.0에서 msdn.microsoft.com/en-us/library/aa237157%28SQL.80%29.aspx를
Martin Smith

4
@bzlm-빨대를 쥐고있는 것처럼 들리며 실제로 SQL Server 데이터 형식에 대해 전혀 모른다. SQL Server에서 비트의 정의는 "1, 0 또는 NULL 값을 가질 수있는 정수 데이터 유형"입니다. msdn.microsoft.com/en-us/library/ms177603.aspx . 이는 열 및 Transact SQL 변수에 적용됩니다. IF(@TRUE)예를 들어 , SQL에서 비트 변수를 부울로 사용할 수 없으며 부울 식을 비트로 강제 변환 할 수 없습니다. (예를 들어,와 SET @BitVariable = (1=1))
마틴 스미스

1
나는 당신이 어디로 가고 있는지 알지만 비트 캐스팅은 EXISTS를 직접 선택할 수있는 것만 큼 큰 문제가되지 않았습니다.
jcollum

1

또 다른 해결책은 다음 ISNULL과 함께 사용 하는 것입니다 SELECT TOP 1 1.

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

-1

나는 존재 는 where 절에서만 사용할 수 있다고 생각 하므로 해결 방법을 수행해야합니다 (또는 where 절이있는 부속 쿼리). 이것이 해결 방법으로 간주되는지 모르겠습니다.

이건 어때?

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

선택의 경우는 어떻습니까?
Lowerkey

-1
SELECT IIF(EXISTS(SELECT * FROM theTable WHERE theColumn LIKE 'theValue%'), 1, 0)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.