2009-07-23 27 views
111

Có thể biểu diễn 1 hoặc 0 như một bit khi được sử dụng làm giá trị trường trong câu lệnh chọn không?Imply bit với hằng số 1 hoặc 0 trong SQL Server

ví dụ:

Trong tuyên bố trường hợp này (là một phần của câu lệnh chọn) ICourseBased thuộc loại int.

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

Để làm cho nó trở thành một loại bit, tôi phải truyền 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ó cách nào ngắn gọn để biểu thị các giá trị dưới dạng bit mà không phải truyền mỗi lần không?

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

Trả lời

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

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

Nếu bạn có nhiều biểu thức như vậy, tôi sẽ khai báo các vars bit @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à "else 0" trên dòng 5. –

+1

Cảm ơn. Làm thế nào ngớ ngẩn ... – gbn

+1

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

5

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ó thể làm cho số điện thoại ít hơn có thể đọc được trong trường hợp này.

1

Thật không may, không. Bạn sẽ phải bỏ từng giá trị riêng lẻ.

7

Bạn có thể thêm đoạn mã thứ hai làm định nghĩa trường cho ICourseBased 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 
+0

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

3

Hơi nhiều ngưng tụ hơn của gbn:

Giả sử CourseId không phải là zero

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

COALESCE giống như một ISNULL(), nhưng trả về đầu tiên không phải là Null.

Một Non-Zero CourseId sẽ nhận được loại đúc để 1, trong khi một null CourseId sẽ gây ra liên hiệp để trả về giá trị tiếp theo, 0

2

Nếu bạn muốn cột là BIT và NOT 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 
0

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

+0

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

+0

Xin chào và chào mừng bạn đến với SO. Vui lòng giải thích câu trả lời của bạn. – Chaithanya

0

Thưởng thức này :) Nếu không có dàn diễn viên từng giá trị riêng.

SELECT ..., 
    IsCoursedBased = CAST(
     CASE WHEN fc.CourseId is not null THEN 1 ELSE 0 END 
    AS BIT 
) 
FROM fc 
Các vấn đề liên quan