Jed*_*Jed 3 sql t-sql ternary sql-server-2008 conditional-statements
我有一个SQLExpress表,其中包含一个用于存储TRUE/FALSE状态的位字段.
就像是:
+----+---------+
| ID | IsAlive |
+----+---------+
| 1 | 1 |
| 2 | 0 |
| 3 | NULL |
| 4 | 1 |
+----+---------+
Run Code Online (Sandbox Code Playgroud)
使用该表作为示例,我想创建一个将执行以下任一操作的存储过程:
IsAlive=1.IsAlive=0 or NULL.我想到如何创建我的查询而不必编写IF/ELSE条件 - 在我看来有一个更好/更清洁的方式比做这样的事情:
-- The ternary logic...
-- 0 or NULL retrieves records where IsAlive = 0 or NULL
-- 1 retrieves records where IsAlive = 1
-- Otherwise return all records
-- sproc .....
@IsAlive tinyint = 2 -- Return all records by default
AS
BEGIN
IF(@SentToNTService = 0 OR @SentToNTService = 1)
BEGIN
SELECT *
FROM MyTable
WHERE IsAlive = @IsAlive;
END
ELSE -- Lame redundancy
BEGIN
SELECT *
FROM MyTable
END
END
Run Code Online (Sandbox Code Playgroud)
是否有另一种创建相同结果的方法,而不必像上面那样创建两个不同的查询?
2建议如何做到这一点:
假设您的变量@isalive也被声明为'bit'(应该是)
SELECT * FROM @t
WHERE @isalive is null or @isalive = coalesce(isalive, 0)
Run Code Online (Sandbox Code Playgroud)
如果你想使用'比较比较'的解决方案,不需要@isalive为'bit'(它将适用于bit和tinyint)
SELECT * FROM @t
WHERE coalesce((1-coalesce(isalive, 0)) ^ @isalive, 1) > 0
Run Code Online (Sandbox Code Playgroud)
第二种解决方案适合像我这样的书呆子.一些铁杆人可能会发现它很有趣(或者至少是有趣的)因为我认为它提供了最好的性能(如果我错了,请有人纠正我).这是一个强大的解决方案,但很难阅读.
| 归档时间: |
|
| 查看次数: |
2773 次 |
| 最近记录: |