SQL Server에서 상수 1 또는 0으로 비트를 암시


154

select 문에서 필드 값으로 사용될 때 1 또는 0을 비트로 표현할 수 있습니까?

예 :

이 경우 statement (select 문의 일부) ICourseBased는 int 유형입니다.

case 
when FC.CourseId is not null then 1
else 0
end
as IsCoursedBased

비트 타입이 되려면 두 값을 모두 캐스팅해야합니다.

case 
when FC.CourseId is not null then cast(1 as bit)
else cast(0 as bit)
end
as IsCoursedBased

매번 캐스팅하지 않고 값을 비트 유형으로 표현하는 간단한 방법이 있습니까?

(MS SQL Server 2005를 사용하고 있습니다)

답변:


226
cast (
  case
    when FC.CourseId is not null then 1 else 0
  end
as bit)

CAST 스펙은 "CAST (expression AS type)"입니다. CASE는 이러한 맥락에서 표현 된 것입니다.

그러한 표현식이 여러 개인 경우 비트 vars @true 및 @false를 선언하고 사용합니다. 또는 정말로 원한다면 UDF를 사용하십시오.

DECLARE @True bit, @False bit;
SELECT @True = 1, @False = 0;  --can be combined with declare in SQL 2008

SELECT
    case when FC.CourseId is not null then @True ELSE @False END AS ...

1
니트는 5 번 라인에서 "else 0"이어야합니다.
Shannon Severance

1
코드의 가독성을 높이기 위해 SQL을 표준화했으며 이제 참 / 거짓을 표현할 때 선언 된 비트 변수를 사용합니다.
Damien McGivern

@Damien McGivern : CAST가 많은 경우에도 유용합니다
gbn

10

두 번째 스 니펫을보기에서 ICourseBased의 필드 정의로 추가 할 수 있습니다.

DECLARE VIEW MyView
AS
  SELECT
  case 
  when FC.CourseId is not null then cast(1 as bit)
  else cast(0 as bit)
  end
  as IsCoursedBased
  ...

SELECT ICourseBased FROM MyView

이것은 작동하지만 cast ()가 NULL 유형을 반환한다는 단점이 있습니다.
Dan

6

아니요, 그러나 해당 표현식의 하위 구성 요소가 아닌 전체 표현식을 캐스트 할 수 있습니다. 사실, 그것은 아마하게 적은 이 경우 읽을.


4

gbn보다 약간 더 응축되었습니다.

CourseId0이 아닌 것으로 가정

CAST (COALESCE(FC.CourseId, 0) AS Bit)

COALESCE처럼 ISNULL(),하지만 첫 번째 비를 돌려줍니다.

Non-Zero CourseId는 1로 타입 캐스트되고, null CourseId은 COALESCE가 다음 값 0을 리턴하게합니다.


4

열을 BIT 및 NOT NULL로하려면 CAST 앞에 ISNULL을 입력해야합니다.

ISNULL(
   CAST (
      CASE
         WHEN FC.CourseId IS NOT NULL THEN 1 ELSE 0
      END
    AS BIT)
,0) AS IsCoursedBased


0

SELECT 내부에서 사용할 표현식은

CAST(IIF(FC.CourseId IS NOT NULL, 1, 0) AS BIT)

이 답변을 더 유용하게 만들고 도서관 / 문서에 대한 링크를 설명하거나 제공하십시오
happymacarts

안녕하세요. SO에 오신 것을 환영합니다. 답을 설명하십시오.
Chait

하지만 IIF는 보다 더 잘 보이는 case when ... else ... end, 하나는 여전히 캐스트에 가지고 10비트 입력합니다.
Fabio A.

-1

이것을 즐기십시오 :) 각 값을 개별적으로 캐스트하지 마십시오.

SELECT ...,
  IsCoursedBased = CAST(
      CASE WHEN fc.CourseId is not null THEN 1 ELSE 0 END
    AS BIT
  )
FROM fc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.