Как объединить два столбца, разделенных символом»/», только если оба столбца не являются нулевыми?

#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. @Гурудикша Дхингра помогает ли это ?