Можно ли сделать вложенные, если в Oracle OCL? - PullRequest
0 голосов
/ 07 января 2019

Я хочу сделать что-нибудь вроде:

CASE WHEN name = 'John'
   THEN
    CASE WHEN surname = 'BBBB' THEN XYZ END AS surname
    CASE WHEN surname = 'CCCC' THEN XYZXYZ END AS second_surname
   ELSE
    CASE WHEN surname  = 'BBBB' THEN ABCDEF END AS third_surname
    CASE WHEN surname  = 'CCCC' THEN ABCDEFABCDEF END AS fourth_surname
   END,

Но я становлюсь ошибкой: ORA-00905: отсутствует ключевое слово

Как мне решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Я думаю, что проблема в том, что вы неправильно используете псевдонимы. Внешнее выражение CASE представляет один скаляр, поэтому конечное внешнее END принимает один псевдоним, и все внутри не должно быть псевдонимом. Так что вы можете попробовать эту версию:

CASE WHEN name = 'John'
     THEN
         CASE WHEN surname = 'BBBB' THEN XYZ
              WHEN surname = 'CCCC' THEN XYZXYZ END
     ELSE
         CASE WHEN surname = 'BBBB' THEN ABCDEF 
              WHEN surname = 'CCCC' THEN ABCDEFABCDEF END
END AS some_alias

Но вы также можете выразить свою логику с помощью одного уровня CASE выражение:

CASE WHEN name = 'John'  AND surname = 'BBBB' THEN XYZ
     WHEN name = 'John'  AND surname = 'CCCC' THEN XYZXYZ
     WHEN (name <> 'John' OR name IS NULL) AND surname = 'BBBB' THEN ABCDEF
     WHEN (name <> 'John' OR name IS NULL) AND surname = 'CCCC' THEN ABCDEFABCDEF END AS some_alias
0 голосов
/ 07 января 2019

Это все разные столбцы, поэтому вам нужен CASE для каждого.

CASE WHEN name = 'John' AND surname = 'BBBB' THEN XYZ END AS surname
CASE WHEN name = 'John' AND surname = 'CCCC' THEN XYZXYZ END AS second_surname
CASE WHEN name <> 'John' AND surname  = 'BBBB' THEN ABCDEF END AS third_surname
CASE WHEN name <> 'John' AND surname  = 'CCCC' THEN ABCDEFABCDEF END AS fourth_surname

Если вам нужен один столбец, тогда будет работать ответ типа @TimBiegeleisen.

Как указывает @MTO, мой не обрабатывает нули. Это решило бы это

CASE WHEN COALESCE(name,'Not John') <> 'John' AND surname  = 'BBBB' THEN ABCDEF END AS third_surname
CASE WHEN COALESCE(name,'Not John') <> 'John' AND surname  = 'CCCC' THEN ABCDEFABCDEF END AS fourth_surname
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...