как использовать оператор case вместе с || оператор в Oracle SQL? - PullRequest
0 голосов
/ 08 мая 2020

Может ли кто-нибудь помочь объяснить значение приведенного ниже sql утверждения?

FROM
  (
    CSA.X_INITIATED_BY_PSID
   ||
    CASE
      WHEN (SELECT USER_FULLNAME
        FROM TABLE_NAME
        WHERE USER_PSID = CSA.X_INITIATED_BY_PSID) IS NULL
      THEN \' - NA\'
      ELSE \' - \'
        ||
        (SELECT USER_FULLNAME
        FROM TABLE_NAME
        WHERE USER_PSID = CSA.X_INITIATED_BY_PSID
        )
    END INTITATED_BY

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Вы не указали структуру своих таблиц, поэтому я использовал минимальный пример:

SELECT dummy || ' ' || 
       CASE  (SELECT count(*) FROM dual) 
         WHEN 1 THEN 'one'
         WHEN 2 THEN 'huh?' 
        END AS x
  FROM dual;

X one
0 голосов
/ 08 мая 2020

Это предложение FROM? Я так не думаю.

Если вы спросите, что он делает, то: он объединяет значение столбца CSA.X_INITIATED_BY_PSID с

  • table_name.user_fullname, если есть строка, в которой USER_PSID равно ранее упомянутому X_INITIATED_BY_PSID
  • NA, если такой строки нет

Например:

SQL> with
  2  -- sample data
  3  csa (x_initiated_by_psid) as
  4    (select 1 from dual union all
  5     select 2 from dual
  6    ),
  7  table_name (user_psid, user_fullname) as
  8    (select 1, 'Little' from dual
  9    )
 10  -- your query
 11  select c.x_initiated_by_psid ||' - '||
 12    case when (select t.user_fullname from table_name t
 13               where t.user_psid = c.x_initiated_by_psid
 14              ) is null then 'NA'
 15         else
 16              (select t.user_fullname from table_name t
 17               where t.user_psid = c.x_initiated_by_psid
 18              )
 19    end result
 20  from csa c;

RESULT
-------------------------------------------------
1 - Little
2 - NA

SQL>

Хотя, вероятно, это чрезмерно сложное решение, поскольку внешнее соединение делает то же самое с меньшими усилиями:

SQL> with
  2  -- sample data
  3  csa (x_initiated_by_psid) as
  4    (select 1 from dual union all
  5     select 2 from dual
  6    ),
  7  table_name (user_psid, user_fullname) as
  8    (select 1, 'Little' from dual
  9    )
 10  -- your query
 11  select c.x_initiated_by_psid ||' - '|| nvl(t.user_fullname, 'NA') result
 12  from csa c left join table_name t on t.user_psid = c.x_initiated_by_psid;

RESULT
-------------------------------------------------
1 - Little
2 - NA

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