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

단일 부울 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;

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

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



답변

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

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


답변

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

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


답변

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

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

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


답변

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

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

Select ~1

이것은 :

select ~convert(bit, 1)

그래서 이것은 :

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


답변

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

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

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

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


답변

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


답변

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

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