SQL Select 문에서 부울 값 반환


144

SQL Select 문에서 부울 값을 반환하는 방법은 무엇입니까?

나는이 코드를 시도했다 :

SELECT CAST(1 AS BIT) AS Expr1
FROM [User]
WHERE (UserID = 20070022)

그리고 그것은 단지 반환 TRUEUserID 테이블에 존재하는 경우 합니다. 나는 그것을 반환 할 FALSE(가) 경우 UserID테이블에 존재하지 않습니다.


3
어떤 dbms? SQL의 세부 사항이 다릅니다.
joshp

SQL Server는 부울 형식을 지원하지 않습니다. 예를 들어 SELECT WHEN CAST(1 AS BIT) THEN 'YES' END AS result오류가 발생 CAST(1 AS BIT)합니다. 즉 동일한 논리 TRUE가 아닙니다.
1

답변:


253

사용자가 존재하지 않으면 가지고있는 것은 전혀 행을 반환하지 않습니다. 필요한 것은 다음과 같습니다.

SELECT CASE WHEN EXISTS (
    SELECT *
    FROM [User]
    WHERE UserID = 20070022
)
THEN CAST(1 AS BIT)
ELSE CAST(0 AS BIT) END

2
별표를 사용하는 이유는 1대신 대신 사용하는 것이 좋습니다 *.

7
@ robertpeter07-둘은 동일하지만 *더 관용적입니다. 이 질문을 참조하십시오 .
Chad

WHILE 루프에서 사용하는 경우 'WHILE'바로 다음에 중괄호 {}로 묶어야합니까?
full_prog_full

반환 된 값에 열 이름을 추가 할 수 있습니까?
xMetalDetectorx

3
@xMetalDetectorx이합니다 (열 이름을 추가하는 나를 위해 일한 AS bool부분은 매우 중요하다) :CAST( CASE WHEN EXISTS ( SELECT * FROM mytable WHERE mytable.id = 1) THEN TRUE ELSE FALSE END AS bool) AS nameofmycolumn
루시오 Mollinedo


22

주어진 일반적으로 1 = true0 = false 행 수를 계산하고로 캐스팅하기 만하면됩니다 boolean.

따라서 게시 된 코드에는 COUNT()추가 된 기능 만 필요합니다 .

SELECT CAST(COUNT(1) AS BIT) AS Expr1
FROM [User]
WHERE (UserID = 20070022)

8
이렇게 Exists(테스트 훨씬 빠르게하고보다 Count(1)많은 수의 행이있는 테이블에 테스트를.
Scott Chamberlain

5
아마. 나는 내 대답에서 성능에 대해 주장하지 않았으며 OP가 원했던 것을 달성하기 위해 최소한의 코드 변경 만했습니다. 그러나 열 UserID이 색인화되거나 PK 인 경우 반드시 존재하거나 존재하지 않는 고유 한 행으로 바로 이동합니다.
Stewart

9

0 또는 1을 반환하는 'Exists'를 사용하십시오.

쿼리는 다음과 같습니다.

SELECT EXISTS(SELECT * FROM USER WHERE UserID = 20070022)

10
오류 : "키워드 'EXISTS'근처의 구문이 잘못되었습니다." sqlfiddle.com/#!18/ef905/18
JoePC

8
select CAST(COUNT(*) AS BIT) FROM [User] WHERE (UserID = 20070022)

count (*) = 0이면 false를 반환합니다. count (*)> 0이면 true를 반환합니다.


4

나는 이렇게한다 :

SELECT 1 FROM [dbo].[User] WHERE UserID = 20070022

부울로 보는 것은 null이 될 수 없으며 (최소한 .NET에서는) 기본값은 false로 설정되거나 기본값이 true이면 직접 설정할 수 있습니다. 그러나 1 = true이므로 null = false이며 추가 구문이 없습니다.

참고 : 저는 Dapper를 마이크로 마이크로로 사용합니다 .ADO가 동일하게 작동해야한다고 생각합니다.


내가 가장 좋아하는 가장 간결한 답변. 모든 답변의 바이올린 : sqlfiddle.com/#!18/ef905/18
JoePC

"부울로 보는 것은 null이 될 수 없습니다 (적어도 .NET에서는). (bool?)은 nullable bool입니다.
앤드류 데니슨

1

다른 동등한 문제를 확인하십시오. 조건이 충족되면 (1), 그렇지 않으면 빈 결과가 반환되는 SQL 쿼리 작성. 이 문제에 대한 해결책이 더 일반적이며 위의 답변과 함께 쉽게 사용하여 질문을 할 수 있습니다. 이 문제가 더 일반적이기 때문에 위에서 제시 한 아름다운 해결책 외에도 그 해결책을 제시하고 있습니다.

SELECT DISTINCT 1 AS Expr1
FROM [User]
WHERE (UserID = 20070022)

1

사용자 정의 열 이름을 추가하여 가치를 얻는 데 관심이있는 사람들에게는 이것이 효과적입니다.

CAST(
    CASE WHEN EXISTS ( 
           SELECT * 
           FROM mytable 
           WHERE mytable.id = 1
    ) 
    THEN TRUE 
    ELSE FALSE 
    END AS bool) 
AS "nameOfMyColumn"

대소 문자를 구분하지 않으려는 경우 (일부 클라이언트에서) 열 이름에서 큰 따옴표를 건너 뛸 수 있습니다.

나는 이것에 대한 @Chad의 대답을 약간 조정했습니다.


메시지 102, 수준 15, 상태 1, 줄 8 'CAST'근처의 구문이 잘못되었습니다. 메시지 156, 수준 15, 상태 1, 줄 12 키워드 'THEN'근처의 구문이 잘못되었습니다.
ShaneC

@ShaneC PostgreSQL 9.X 에서이 코드를 테스트했으며 정상적으로 작동했습니다. 어떤 서버를 사용하고 있습니까?
Lucio Mollinedo

0
DECLARE @isAvailable      BIT = 0;

IF EXISTS(SELECT 1  FROM [User] WHERE (UserID = 20070022))
BEGIN
 SET @isAvailable = 1
END

처음에는 isAvailable 부울 값이 0으로 설정됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.