我的列类型是INT,如果它包含1则我想选择1,否则选择0。我只知道使用CASE的方法:
CASE WHEN val=1 THEN 1 ELSE 0
有什么其他方法可以达到相同的效果?
答案 0 :(得分:36)
SQL SERVER 2012:
SELECT CAST(IIF ( field = 1, 1, 0 ) AS BIT) FROM table
否则:
SELECT CAST(CASE field WHEN 1 THEN 1 ELSE 0 END AS BIT) From table
答案 1 :(得分:5)
您所要做的就是将int
转换/转换为bit
。
DECLARE
@val INT = 42;
,@bitVal BIT;
SET @bitVal = CAST(@val AS BIT); -- equals 1
任何非零数字都将转换为true。
https://technet.microsoft.com/en-us/library/ms191530(v=sql.105).aspx#_bit
答案 2 :(得分:3)
要转换很简单,只要它是1或0你就可以分配它,不需要投射任何东西
当你声明一个变量时,你会这样做吗?
@declare @myBit bit =1;
然而,当您想要对像位图比较这样的整数做更有用的事情时,事情变得更有趣。你可以比较两个整数,并根据定义的方式返回一点 让我试着想象一下
00000001=1
00000010=2
00000011=3
==============
FFFFFFTT
所以,如果你有一个值,那么该值变为True,
实际上它是一个位图比较,2个值就像映射栅格一样,你可以在字节级使用0 + 1对它们进行多次或甚至分组。
上面你可以看到1"在" 3以及2"在" 3
查看下面的TSQL单元测试示例
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')
您可以使用位运算符|将值组合在一起 像这样1 | 2 = 3,1和1 = 1,不要混淆" |"与" +"这里因为它不会总是运作良好; - )
一个例子,错误是@CanView + @CanView将是 @CanEdit ,
当你期待@CanView |时@canView仍然是@canView
在SQL中试用
SELECT (1|1), (1+1)
在某些C#下面,希望它可以帮助那些喜欢在代码和数据库中保存和使用枚举的人。
假设你有一个Enum和一个这样的类: [标志] 公共枚举权利 { 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 ;
您现在可以将权限存储在数据库中,并使用以下方法之一读取值,您可以在其中比较一个或比较几个
var result = user.Permission & Rights.CanView == Rights.CanView;
var canChange = ((user.Permission & (Rights.CanView | Rights.CanEdit | Rights.CanDelete)) != 0);
所以,Round Trip to the database and back,希望你有你想要的东西
快乐编码,
沃尔特
答案 3 :(得分:1)
这是另一个解决方案。没有case
或iif
:
select ~cast(sign(abs(@i - 1)) as bit)
但是如果@i = -2147483648它不起作用。然后,您应该将其转换为bigint
。