我有一个 INT 类型的列,如果其中包含 1,我想选择 1;否则选择 0。我知道这样做的唯一方法是使用 CASE 语句:
CASE WHEN val=1 THEN 1 ELSE 0
有哪些其他方法可以达到相同的结果?
我有一个 INT 类型的列,如果其中包含 1,我想选择 1;否则选择 0。我知道这样做的唯一方法是使用 CASE 语句:
CASE WHEN val=1 THEN 1 ELSE 0
有哪些其他方法可以达到相同的结果?
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
field
是否等于 0。 - Greg您需要做的是将 int
转换为 bit
。
DECLARE
@val INT = 42;
,@bitVal BIT;
SET @bitVal = CAST(@val AS BIT); -- equals 1
任何非零数都会被转换为真。 https://technet.microsoft.com/zh-cn/library/ms191530(v=sql.105).aspx#_bit
转换很简单,只要是1或0就可以直接赋值,无需进行强制转换。
当您声明一个变量时,也是同样的道理吧?
@declare @myBit bit =1;
然而,当你想要对整数执行更有用的操作,例如位图比较时,事情就变得更加有趣。你可以比较两个整数,并根据定义的方式返回一个基于位的比特。
让我尝试形象化说明
00000001=1
00000010=2
00000011=3
==============
FFFFFFTT
如果您有一个1,则该值变为True。
实际上,对于两个值的位图比较就像映射光栅一样,您可以在字节级别上使用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')
SELECT (1|1), (1+1)
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);
所以,已经往返于数据库之间,希望你找到了你要的内容。
编程愉快,
沃尔特
case
或iif
:select ~cast(sign(abs(@i - 1)) as bit)
但是当 @i = -2147483648 时是无法使用的。因此,您需要将其转换为 bigint
。
DECLARE @r VARCHAR(10)='1' SELECT CAST(@r AS BIT)
- Royi Namir