将INT转换为BIT的最佳方法

时间:2013-12-12 13:40:17

标签: sql-server tsql

我的列类型是INT,如果它包含1则我想选择1,否则选择0。我只知道使用CASE的方法:

CASE WHEN val=1 THEN 1 ELSE 0

有什么其他方法可以达到相同的效果?

4 个答案:

答案 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)

这是另一个解决方案。没有caseiif

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

但是如果@i = -2147483648它不起作用。然后,您应该将其转换为bigint