#sql #oracle #null #concatenation #notnull
Вопрос:
Я пытаюсь объединить два столбца со значениями, разделенными символом»/», только если оба столбца не являются нулевыми. Если любой из столбцов равен нулю, то » / » не следует печатать. Пример:
выходной ток :
concat(concat(purpose,'/'),priority)
abc/xyz
/xyz
abc/
Ожидаемые результаты :
abc/xyz
xyz
abc
Ответ №1:
Используйте CASE
(см. строку №9):
SQL> with test (col1, col2) as
2 (select 'abc', 'xyz' from dual union all
3 select null , 'xyz' from dual union all
4 select 'abc', null from dual
5 )
6 select col1,
7 col2,
8 --
9 col1 || case when col1 is not null and col2 is not null then '/' end || col2 result
10 from test;
COL1 COL2 RESULT
----- ----- -------
abc xyz abc/xyz
xyz xyz
abc abc
SQL>
Или используйте трюк — удалите начальную/конечную (читай: обе) косые черты:
SQL> with test (col1, col2) as
2 (select 'abc', 'xyz' from dual union all
3 select null , 'xyz' from dual union all
4 select 'abc', null from dual
5 )
6 select col1,
7 col2,
8 trim(both '/' from col1 ||'/'|| col2) result
9 from test;
COL1 COL2 RESULT
----- ----- -------
abc xyz abc/xyz
xyz xyz
abc abc
SQL>
Ответ №2:
Здесь мы используем CASE WHEN
для поиска условий, описанных в вопросе. Первое условие-проверить, нет ли обоих столбцов Null
. Если это так, то мы соединяем два столбца вместе с /
промежуточным.
Если у нас есть случай, когда один из столбцов равен Null
, мы просто возвращаем значение столбца, которое не равно нулю. Для этой цели мы и используем COALESCE
. COALESCE
всегда возвращает первое ненулевое значение.
Select
col_one,
col_two,
case when col_one is not null and col_two is not null
then concat(col_one, "/",col_two)
else COALESCE(col_one,col_two) end as concat_final
from table
Комментарии:
1. @Гурудикша Дхингра помогает ли это ?