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ì?
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ì?
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
Tôi tin rằng thực hành tốt nhất là kiểm tra xem 'trường' = 0 thay thế – Greg
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
.
Để 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
Tất cả bạn phải làm là đúc/chuyển đổi int
đến bit
.
DECLARE
@val INT = 42;
,@bitVal BIT;
SET @bitVal = CAST(@val AS BIT); -- equals 1
Mọi số khác không sẽ được chuyển thành đúng.
https://technet.microsoft.com/en-us/library/ms191530(v=sql.105).aspx#_bit
'DECLARE @r VARCHAR (10) = '1' CHỌN CAST (@r AS BIT) ' –
@RoyiNamir: ** INT ** nhưng chuỗi;) – danihp
@danihp sẽ làm việc còn nếu val là int :-) –