T-SQL의 부울 'NOT'이 '비트'데이터 유형에서 작동하지 않습니까?


81

단일 부울 NOT 연산을 수행하려고하면 MS SQL Server 2005에서 다음 블록이 작동하지 않는 것으로 보입니다.

DECLARE @MyBoolean bit;
SET @MyBoolean = 0;
SET @MyBoolean = NOT @MyBoolean;
SELECT @MyBoolean;

대신, 나는 더 성공하고 있습니다

DECLARE @MyBoolean bit;
SET @MyBoolean = 0;
SET @MyBoolean = 1 - @MyBoolean;
SELECT @MyBoolean;

그러나 이것은 부정처럼 단순한 것을 표현하는 약간 뒤틀린 방식으로 보입니다.

내가 뭔가를 놓치고 있습니까?


답변:


151

~ 연산자를 사용하십시오.

DECLARE @MyBoolean bit
SET @MyBoolean = 0
SET @MyBoolean = ~@MyBoolean
SELECT @MyBoolean

11
그것은 당신이 약간이 아니라 int를 사용하고 있기 때문입니다.
Jonas Lincoln

4
열이 조금 ... DB 버전이 중요 할 수 있습니까?
Martin

저는 이것이 SQL Server 2008에서 작동한다는 것을 알고 있습니다. 저는 항상 이것을합니다. 질문은 SQL Server 2005에 대한 것이 었는데 거기에서 작동하는지 여부는 확실하지 않습니다.
Dan VanWinkle 2011

3
수정 : MS에 따르면 이것은 2005 년에도 작동 할 것이라고합니다. 여기에 더 많은 정보가 있습니다 .
Dan VanWinkle 2011

3
멋진 대답, 난 그냥 2000도 SQL 서버에, 그것을 테스트하고 잘 작동
알베르토 마르티네즈

25

귀하의 솔루션은 좋은 것입니다 ...이 구문을 사용하여 SQL에서 약간의 토글을 할 수도 있습니다 ...

DECLARE @MyBoolean bit;
SET @MyBoolean = 0;
SET @MyBoolean = @MyBoolean ^ 1; 
SELECT @MyBoolean;

1
참고로 이것은 비트 배타적 연산이기 때문에 작동합니다. 여러 언어에서 XOR 연산자와 동일합니다. 이것은 SET @MyBoolean = 1 - @MyBoolean정수 수학이 아닌 비트 수학을 사용 하는 것을 제외하고 는 기본적으로 수행하는 것과 동일 합니다. 이것이 적절하고 작동하지만 비트 수학을 이해하지 못하는 사람들에게는 혼란 스러울 수 있습니다. 여기에 더 많은 정보가 있습니다 . @Jonas Lincoln의 솔루션 이 더 좋습니다.
Dan VanWinkle 2011

1
참고로이 솔루션은 계산 된 필드에서 작동하지만 case 문은 작동하지 않습니다. 감사!
anyeone aug

22

1에서 값을 빼는 것이 트릭을 할 것 같지만 의도를 표현하는 측면에서 다음과 같이하는 것이 좋습니다.

SET @MyBoolean = CASE @MyBoolean WHEN 0 THEN 1 ELSE 0 END

더 장황하지만 이해하기가 더 쉽다고 생각합니다.


10

반전 된 비트를 할당하려면 비트 NOT 연산자를 사용해야합니다. 비트 NOT 연산자 '~'를 사용할 때 열이나 변수가 비트로 선언되었는지 확인해야합니다.

이것은 0을주지 않습니다.

Select ~1 

이것은 :

select ~convert(bit, 1)

그래서 이것은 :

declare @t bit
set @t=1
select ~@t

9

SQL 2005에는 실제 부울 값이 없으며 비트 값은 실제로 다른 것입니다.

비트는 1, 0 및 null (데이터이기 때문에)의 세 가지 상태를 가질 수 있습니다. SQL은이를 참 또는 거짓으로 자동 변환하지 않습니다 (하지만 SQL 엔터프라이즈 관리자는 혼란 스러울 것입니다).

논리에서 비트 필드를 생각하는 가장 좋은 방법은 1 또는 0의 정수입니다.

비트 필드에서 직접 논리를 사용하는 경우 다른 값 변수처럼 동작합니다. 즉, 값 (모든 값)이 있으면 논리가 true이고 그렇지 않으면 false입니다.


5

BIT는 부울이 아닌 숫자 데이터 유형입니다. 이것이 부울 연산자를 적용 할 수없는 이유입니다.
SQL Server에는 BOOLEAN 데이터 유형이 없으므로 (SQL SERVER 2008에 대해 확실하지 않음) @Matt Hamilton의 솔루션과 같은 것을 고수해야합니다.


4

ABS절대 값을 구하는 데 사용 합니다 (-1이 1이 됨) ...

DECLARE @Trend AS BIT
SET @Trend = 0
SELECT @Trend, ABS(@Trend-1)

2
-1처음에 왜 발생 하는지 설명하지 못했습니다 . 즉, 빼기가 OP가 사용한보다 논리적이고 직관적 인 형식으로 표현되면 그렇지 않습니다. 이것은 그것을 수행하는 무의미한 비밀스럽고 둥근 방법입니다.
underscore_d
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.