首页 > 解决方案 > DB2 如何使用具有多个条件的用例?

问题描述

我有一个 DB2 服务器,我想根据条件选择数据。如果我在 ColumnX、ColumnY 或 ColumnZ 中有值,它应该在和Value之间搜索它 我的语句是一堆左外连接,但它看起来像这样:TB2.Column1TB3.Column1

SELECT
CASE
    WHEN (TB1.ColumnX || TB1.ColumnY || TB1.ColumnZ) = 'Value'
    THEN Statement1
    ELSE ' '
END AS MyColumn
FROM
TB1 LEFT OUTER JOIN TB2 ON TB1.JOINCOL = TB2.JOINCOL
    LEFT OUTER JOIN TB3 ON TB2.JOINCOL2 = TB3.JOINCOL
WHERE TB1.Column1 between TB2.Column1 and TB3.Column1

但是不行,是不是语法有错误?

标签: db2

解决方案


仅使用一个表达式无法检查多个等式。您可以使用以下语法技巧:

CASE WHEN 'Value' IN (TB1.ColumnX, TB1.ColumnY, TB1.ColumnZ)
     THEN Statement1 ELSE ' ' END AS MyColumn

对此的替代方法是对每一列重复完全相等检查:

SELECT
    CASE
    WHEN TB1.ColumnX = 'Value' OR
         TB1.ColumnY = 'Value' OR
         TB1.ColumnZ = 'Value'
    THEN Statement1
    ELSE ' '
    END AS MyColumn
FROM
TB1 LEFT OUTER JOIN TB2
    ON TB1.JOINCOL = TB2.JOINCOL
LEFT OUTER JOIN TB3
    ON TB2.JOINCOL2 = TB3.JOINCOL
WHERE
    TB1.Column1 BETWEEN TB2.Column1 AND TB3.Column1;

如果您需要引用子句中的CASE表达式,那么您有两种选择。WHERE首先,您可以对当前查询进行子查询,并为CASE表达式分配别名:

SELECT *
FROM
(
    SELECT CASE WHEN ... AS exp
    FROM TB1 ...
) t
WHERE exp = ...

或者,您可以避免子查询,而只在子句中重复整个CASE表达式。WHERE


推荐阅读