source

EXISTES를 직접 선택할 수 있습니까?

lovecheck 2023. 4. 7. 21:34
반응형

EXISTES를 직접 선택할 수 있습니까?

다음과 같은 작업을 수행할 수 있는지 궁금했습니다(실패).

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

실행 가능한 것처럼 보이지만 SQL에서 동작해야 할 많은 것들이 그렇지 않습니다.(SELECT 1에서는...) 이 문제에 대한 회피책을 보았습니다.존재함...)하지만 존재함수의 결과를 조금 캐스팅하고 끝낼 수 있을 것 같습니다.

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

조건부 비트 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
SELECT CAST(COUNT(*) AS bit) FROM MyTable WHERE theColumn like 'theValue%'

비트를 던졌을 때

  • 0 - > 0
  • 기타 모든 것 -> 1
  • 또한 특수한 순서 -> 특수한 순서입니다만, GROUP BY가 없으면 카운트(*)를 사용하여 NULL을 취득할 수 없습니다.

bit직접 맵boolean.net datatype을 사용합니다.설령 그게 아니더라도...

이것은 비슷해 보이지만 일치하지 않으면 행(0이 아님)이 표시되지 않으므로 동일하지 않습니다.

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

사용할 수 있습니다.IIF그리고.CAST

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

나는 이것을 이해하는데 조금 늦었다; 그냥 우연히 포스트를 발견했다.다만, 여기에서는, 선택한 회답보다 효율적이고 깔끔하지만, 같은 기능을 제공할 필요가 있는 솔루션이 있습니다.

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

다음 작업도 수행할 수 있습니다.

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

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

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

아니, 그건 불가능해.비트 데이터 형식이 부울 데이터 형식이 아닙니다.0, 1 또는 NULL을 지정할 수 있는 정수 데이터 유형입니다.

또 다른 해결책은ISNULL와 병행하여SELECT TOP 1 1:

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

exists는 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

언급URL : https://stackoverflow.com/questions/2759756/is-it-possible-to-select-exists-directly-as-a-bit

반응형