powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Объединение ячеек
7 сообщений из 7, страница 1 из 1
Объединение ячеек
    #38028909
Xromou
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Есть таблица TAb1 со столбцами col1, col2, col3, col4
Нужно объединить данные в одну строку через запятую, но если ячейка пустая тогда запятую не ставим.

То есть "col1, col2, col3, col4"
а если, допустим, col3 пустое, тогда нужно получить "col1, col2, col4"


Можно ли это сделать на sql??
...
Рейтинг: 0 / 0
Объединение ячеек
    #38028992
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Xromou,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
with t1(col1, col2, col3,col4) as (
  values ('1',  '2',  '3',  '4'),
         ('1',  '2',  '3',  NULL),
         ('1',  '2',  NULL, '4' ),
         ('1',  '2',  NULL, NULL),
         ('1',  NULL, '3',  NULL),
         ('1',  NULL, NULL, '4' ),
         ('1',  NULL, NULL, NULL),
         ('1',  '2',  '3',  '4' ),
         (NULL, '2',  '3',  NULL),
         (NULL, '2',  NULL, '4' ),
         (NULL, '2',  NULL, NULL),
         (NULL, NULL, '3',  NULL),
         (NULL, NULL, NULL, '4' ),
         (NULL, NULL, NULL, NULL)
),
t2(row_id, col1, col2, col3, col4) as (
  select ROW_NUMBER() OVER() as row_id, col1, col2, col3, col4
  from t1
),
t3(row_id, col_id, value) as (
  select row_id, 1, col1 from t2
  union all
  select row_id, 2, col2 from t2
  union all
  select row_id, 3, col3 from t2
  union all
  select row_id, 4, col4 from t2
)

select LISTAGG(value, ', ') WITHIN GROUP (ORDER BY col_id)
 from t3
 group by row_id;


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
'1, 2, 3, 4'
'1, 2, 3'
'1, 2, 4'
'1, 2'
'1, 3'
'1, 4'
1
'1, 2, 3, 4'
'2, 3'
'2, 4'
2
3
4
NULL

Если NULL в конце не нравится, можно заменить на COALESCE(LISTAGG(value, ', ') WITHIN GROUP (ORDER BY col_id), '')
...
Рейтинг: 0 / 0
Объединение ячеек
    #38028995
Xromou
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решил таким образом

Код: sql
1.
2.
3.
4.
5.
6.
SELECT 
CASE WHEN col1 IS NOT NULL or col1 <> '' THEN col1 || ', ' END
|| CASE WHEN col2 IS NOT NULL or col2 <> '' THEN col2 || ', ' END
|| CASE WHEN col3 IS NOT NULL or col3 <> '' THEN col3 || ', ' END
CASE WHEN col4 IS NOT NULL or col4 <> '' THEN col4 END
FROM tab1



Правда последний элемент всегда должен быть не пустым. Решение крайне кривое. Подскажите более адекватное?
...
Рейтинг: 0 / 0
Объединение ячеек
    #38028997
Xromou
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CawaSPb,

Большое спасибо.
...
Рейтинг: 0 / 0
Объединение ячеек
    #38029025
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Xromou,

Я не уверен, что приведённое прямое (на сколько-нибудь значимых объёмах данных). Надо смотреть реальные планы выполнения.

В то время как грандиозный CASE, в который будет запихиваться вся матрица NULL/не NULL будет работать гарантированно быстро.
Правда размер этого CASE будет расти как квадрат от количества сливаемых колонок.
...
Рейтинг: 0 / 0
Объединение ячеек
    #38039720
CawaSPb,

select substr (value (',' || col1,'') || value (',' || col2,'') || value (',' || col3,'') || value (',' || col4,''),2)
from t1 where (value (col1,value (col2,value (col3,value (col4,'')))))<>'';
...
Рейтинг: 0 / 0
Объединение ячеек
    #38041294
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Слободской Андрей,

Логично. Лучший вариант.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Объединение ячеек
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]