将带有OR运算符的WHERE子句转换为CASE

时间:2018-02-21 15:36:34

标签: sql sql-server tsql

解决方案可能非常简单,但也许今天工作量太大,或者我只是愚蠢而且此刻无法自行解决,但我现在真的需要它。

所以,让我说我有这样的查询:

DECLARE @input BIT
SELECT A
FROM T1
WHERE (@input = 1 AND A = 3) OR (@input = 0 AND (A = 3 OR A <> 3))

我想在where子句中使用CASE,如果输入参数等于1,则它应该仅限制为列A的某些值,如果它等于0 },应该允许所有值。

我在想我应该使用没有ELSE部分的案例陈述:

CASE WHEN @input = 1 THEN A = 3 END

但在THEN部分,它预期结果,而不是另一个条件。

3 个答案:

答案 0 :(得分:3)

试试这个:

WHERE A = CASE WHEN @input = 1 THEN 3 ELSE A END

答案 1 :(得分:2)

for SQL 2012 +

WHERE A = IIF(@input = 1,3,A)

答案 2 :(得分:2)

所以,让我们把这个代码分开:

def process_one():
    def one():
        while True:
            print("one")
            time.sleep(1)

    def two():
        while True:
            print("two")
            time.sleep(1)

    def three():
        while True:
            print("three")
            time.sleep(1)

    a = Thread(target=one)
    b = Thread(target=two)
    c = Thread(target=three)
    a.start()
    b.start()
    c.start()


if __name__ == '__main__':
    p1 = Process(target=process_one)
    p1.start()

DECLARE @input BIT SELECT A FROM T1 WHERE (@input = 1 AND A = 3) OR (@input = 0 AND (A = 3 OR A <> 3)) 将始终评估为A = 3 OR A <> 3,因此毫无意义。我们将其删除。

true

由于WHERE (@input = 1 AND A = 3) OR @input = 0 有点,它只能有@input01 - 所以我们可以进一步简化它:

null

现在,如果是WHERE @input != 1 OR A = 3 ,则仅记录将返回@input = 1的记录,如果A = 3@input = 0,则会返回所有记录。

所以完整的脚本变成了这个:

@input is null

使用DECLARE @input BIT SELECT A FROM T1 WHERE @input != 1 OR A = 3 表达式,更简单,更优雅,恕我直言......