2013-12-12 29 views
13

Tôi có loại cột INT, tôi muốn chọn 1 nếu nó chứa 1 và 0 nếu không. Tôi chỉ biết cách sử dụng CASE:Cách tốt nhất để chuyển đổi INT thành BIT

CASE WHEN val=1 THEN 1 ELSE 0 

Các phương pháp khác để đạt được kết quả tương tự là gì?

+1

'DECLARE @r VARCHAR (10) = '1' CHỌN CAST (@r AS BIT) ' –

+0

@RoyiNamir: ** INT ** nhưng chuỗi;) – danihp

+0

@danihp sẽ làm việc còn nếu val là int :-) –

Trả lời

26

SQL SERVER 2012:

SELECT CAST(IIF (field = 1, 1, 0) AS BIT) FROM table 

Nếu không:

SELECT CAST(CASE field WHEN 1 THEN 1 ELSE 0 END AS BIT) From table 
+2

Tôi tin rằng thực hành tốt nhất là kiểm tra xem 'trường' = 0 thay thế – Greg

1

Dưới đây là một giải pháp hơn. Nếu không có case hoặc iif:

select ~cast(sign(abs(@i - 1)) as bit) 

Nhưng nó không hoạt động nếu @i = -2147483648. Sau đó, bạn nên chuyển đổi nó thành bigint.

3

Để chuyển đổi rất đơn giản, miễn là nó là 1 hoặc 0 bạn chỉ có thể gán nó, không cần phải bỏ bất cứ điều gì

bạn làm như vậy khi bạn khai báo một biến phải không?

@declare @myBit bit =1; 

tuy nhiên khi bạn muốn làm điều gì đó hữu ích hơn với số nguyên như những thứ so sánh bitmap trở nên thú vị hơn. bạn có thể so sánh hai số nguyên và trả về một bit dựa trên cách xác định.
Hãy để tôi thử và hình dung

00000001=1 
    00000010=2 
    00000011=3 
============== 
    FFFFFFTT 

vì vậy nếu bạn có 1 giá trị trở thành True,

Trên thực tế nó là một so sánh bitmap với 2 giá trị là như ánh xạ một raster, bạn có thể có một số hoặc thậm chí nhóm chúng bằng cách sử dụng 0 + 1 ở mức byte.

Ở trên bạn có thể thấy rằng 1 "là trong" 3 cũng như 2 rằng "là trong" 3

nhìn vào ví dụ TSQL đơn vị kiểm tra dưới đây

declare @notSet  int =0 
     , @CanView int =1 
     , @CanEdit int =2 
     , @CanSubmit int =4 
     , @CanApprove int =8 
     , @CanDelete int =16; 

declare @contributor int = @CanView | @CanEdit | @CanSubmit  --> Can't delete 
     , @moderator int = @CanView | @CanEdit | @CanDelete  --> not allowed to sumbit 
     , @admin  int = @CanView | @CanEdit | @CanSubmit | @CanApprove | @CanDelete;--> can do all 

SELECT TEST='A admin can Submit'   , RESULT= iif(@admin  & @CanSubmit = @CanSubmit,'TRUE','FALSE') 
UNION ALL 
SELECT TEST='A Moderator may not Submit' , RESULT= iif(@moderator & @CanSubmit = @CanSubmit,'FALSE','TRUE') 
UNION ALL 
SELECT TEST='A Contributer may not delete' , RESULT= iif(@contributor & @CanDelete = @CanDelete,'FALSE','TRUE') 
UNION ALL 
SELECT TEST='A Moderator may delete'  , RESULT= iif(@moderator & @CanDelete = @CanDelete,'TRUE','FALSE') 

Bạn có thể kết hợp các giá trị cùng sử dụng toán tử bit | như thế này 1 | 2 = 3 và 1 | 1 = 1, không trộn lẫn "|" với một "+" ở đây vì nó sẽ không luôn luôn làm việc tốt ;-)

Một ví dụ, các lỗi sẽ @CanView + @CanView sẽ @CanEdit,

khi bạn mong đợi @CanView | @canView vẫn sẽ @canView

Hãy thử nó trong SQL

SELECT (1|1), (1+1) 

Dưới đây một số C#, Hy vọng nó giúp những người muốn tiết kiệm và làm việc với enums trong mã và cơ sở dữ liệu.

Giả sử bạn có một Enum và một lớp học như thế này: [Flags] Quyền enum công { notSet = 0 , CanView = 1 , CanEdit = 2 , CanSubmit = 4 , CanApprove = 8 , CanDelete = 16 }

public class User 
{ 
    public Rights Permission {get;set} 
} 

... 
// user can change his own posts 
var user = new User(); 
user.Permission = Rights.CanView | Rights.CanEdit | Rights.CanDelete ; 

Bây giờ bạn có thể lưu trữ được sự cho phép trong cơ sở dữ liệu và đọc giá trị bằng một trong những phương thức dưới đây mà bạn so sánh một hoặc so sánh một vài

01.
var result = user.Permission & Rights.CanView == Rights.CanView; 
var canChange = ((user.Permission & (Rights.CanView | Rights.CanEdit | Rights.CanDelete)) != 0); 

Vì vậy, Vòng Vấp cơ sở dữ liệu và trở lại, hy vọng bạn có những gì bạn đang tìm kiếm

Chúc mừng mã hóa,

Walter

Các vấn đề liên quan