IBM DB2 Case in Where子句?

时间:2019-07-01 01:34:54

标签: db2

我有一条SQL语句,由于它有重复项,因此必须检查行中的条件。 Condition1的目的是观察tb1中一列的值是否在tb2两列中的两个值之间,但仅在内部有'Y'的行上。

我有这样的东西:

SELECT DISTINCT

tb1.columnA, tb1.columnB, tb2.columnA, tb2.columnB,

CASE 
    WHEN tb1.col1 = 'Y'
    THEN CONCAT(tb1.col2,tb2.col2)
    ELSE 'no changes'
END as conditionColumn

FROM
    tb1 left outer join tb2 on tb1.columnX  tb2.columnX

WHERE   

CASE 
    WHEN tb1.col1 = 'Y'
    THEN Condition1
    ELSE Condition2
END

从我之前所见,where子句中不允许使用case语句? 那我该如何处理呢?

编辑

当我在tb1.col1中输入'Y'时 where子句应向我输出在tb1.columnA中指定的ID,并且仅输出tb1.ColumnB中的值在tb2.columnA和tb2.columnB之间的行。如果里面没有Y字样,只需给我ID

所以我用了它,但是它给了我一个语法错误:

SELECT DISTINCT

tb1.columnA, tb1.columnB, tb2.columnA, tb2.columnB,

CASE 
    WHEN tb1.col1 = 'Y'
    THEN CONCAT(tb1.col2,tb2.col2)
    ELSE 'no changes'
END as conditionColumn

FROM
    tb1 left outer join tb2 on tb1.columnX  tb2.columnX
WHERE   

CASE 
    WHEN tb1.col1 = 'Y'
    THEN tb1.columnA = 'MyID'
    AND tb1.columnB BETWEEN tb2.columnA and tb2.columnB
    ELSE tb1.columnA = 'MyID'
END

2 个答案:

答案 0 :(得分:0)

您似乎对WHERE子句的目的感到困惑...

WHERE子句的全部作用是确定是否返回给定的行。它无法更改返回的数据。

要更改数据,您需要在所选列中使用CASE ...

类似的东西...

SELECT DISTINCT
CASE 
    WHEN tb1.col1 = 'Y'
         AND tb1.columnB BETWEEN tb2.columnA and tb2.columnB
      then 'MyID'
    ELSE tb1.columnA
END as newColumnA,
    tb1.columnB, tb2.columnA, tb2.columnB,
CASE 
    WHEN tb1.col1 = 'Y'
    THEN CONCAT(tb1.col2,tb2.col2)
    ELSE 'no changes'
END as conditionColumn
FROM
    tb1 left outer join tb2 on tb1.columnX  tb2.columnX

答案 1 :(得分:0)

如果您想这样做

WHERE   

CASE 
    WHEN tb1.col1 = 'Y'
    THEN Condition1
    ELSE Condition2
END

然后,可能您想要的是这个

WHERE   

    ( tb1.col1 = 'Y'  AND Condition1 )
 OR ( tb1.col1 <> 'Y' AND Condition2 )