DB2 Как использовать кейс с несколькими условиями? - PullRequest
0 голосов
/ 24 июня 2019

У меня есть сервер DB2, и я хочу выбрать данные в зависимости от условия.Если у меня есть значение Value в ColumnX, ColumnY или ColumnZ, оно должно искать его между TB2.Column1 и TB3.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

Но это не работает, есть ошибка в синтаксисе?

1 Ответ

0 голосов
/ 24 июня 2019

Невозможно проверить наличие нескольких равенств, используя только одно выражение.Вы можете использовать следующий синтаксический прием:

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пункт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...