Hàm ý bit với hằng số 1 hoặc 0 trong SQL Server


154

Có thể biểu thị 1 hoặc 0 dưới dạng bit khi được sử dụng làm giá trị trường trong câu lệnh chọn không?

ví dụ

Trong trường hợp này, câu lệnh (là một phần của câu lệnh chọn) ICferenceB theo kiểu int.

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

Để có được nó là một loại bit tôi phải bỏ cả hai giá trị.

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

Có một cách ngắn gọn để thể hiện các giá trị dưới dạng bit mà không phải truyền mỗi lần?

(Tôi đang sử dụng MS SQL Server 2005)

Câu trả lời:


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

Thông số CAST là "CAST (loại AS biểu thức)". CASE là một biểu thức trong bối cảnh này.

Nếu bạn có nhiều biểu thức như vậy, tôi sẽ khai báo bit vars @true và @false và sử dụng chúng. Hoặc sử dụng UDF nếu bạn thực sự muốn ...

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
Một nit, phải là "khác 0" trên dòng 5.
Shannon Severance

1
Để làm cho mã dễ đọc hơn, chúng tôi đã chuẩn hóa SQL của chúng tôi và bây giờ sử dụng các biến bit được khai báo khi chúng tôi cần thể hiện đúng / sai.
Damien McGivern

@Damien McGivern: Tôi cũng thấy nó hữu ích khi tôi có nhiều CAST
gbn

10

Bạn có thể thêm đoạn mã thứ hai làm định nghĩa trường cho ICferenceBasing trong chế độ xem.

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

Điều này hoạt động, nhưng có nhược điểm là cast () trả về kiểu NULL.
Dan

6

Không, nhưng bạn có thể truyền toàn bộ biểu thức thay vì các thành phần phụ của biểu thức đó. Trên thực tế, điều đó có lẽ làm cho nó ít đọc hơn trong trường hợp này.


4

Hơi cô đặc hơn gbn:

Giả sử CourseIdlà khác không

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

COALESCEgiống như một ISNULL(), nhưng trả về non-Null đầu tiên.

Một Non-Zero CourseIdsẽ nhận kiểu truyền thành 1, trong khi null CourseIdsẽ khiến COALESCE trả về giá trị tiếp theo, 0


4

Nếu bạn muốn cột là BIT và KHÔNG NULL, bạn nên đặt ISNULL trước CAST.

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

1

Tiếc là không có. Bạn sẽ phải bỏ từng giá trị riêng lẻ.


0

Biểu thức sử dụng bên trong CHỌN có thể là

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

Làm cho câu trả lời này hữu ích hơn và giải thích hoặc cung cấp liên kết đến thư viện / tài liệu
happymacarts

Xin chào, và chào mừng đến với SO. Hãy giải thích câu trả lời của bạn.
Chait

Mặc dù IIF trông tốt hơn so với case when ... else ... end, một vẫn phải dàn diễn viên 10để kiểu BIT.
Fabio A.

-1

Tận hưởng điều này :) Không bỏ từng giá trị riêng lẻ.

SELECT ...,
  IsCoursedBased = CAST(
      CASE WHEN fc.CourseId is not null THEN 1 ELSE 0 END
    AS BIT
  )
FROM fc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.