如何在T-SQL中的位字段上创建三元条件

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)

使用该表作为示例,我想创建一个将执行以下任一操作的存储过程:

  1. 检索所有记录.
  2. 仅检索记录IsAlive=1.
  3. 仅检索记录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)

是否有另一种创建相同结果的方法,而不必像上面那样创建两个不同的查询?

t-c*_*.dk 5

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)

第二种解决方案适合像我这样的书呆子.一些铁杆人可能会发现它很有趣(或者至少是有趣的)因为我认为它提供了最好的性能(如果我错了,请有人纠正我).这是一个强大的解决方案,但很难阅读.