powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Разбить значения после запятой на строки, не отражая в последующих строках значения
6 сообщений из 6, страница 1 из 1
Разбить значения после запятой на строки, не отражая в последующих строках значения
    #39640025
Kill_spree
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите разбить значения после запятой на строки, не отражая в последующих строках значения.
Имеется таблица, содержащая в себе значения, разделенные запятой (не все значения разделены) и метрики, подскажите, как разбить их на строки, поглотив некоторые значения колонок.
На данный момент при помощи regexp_split_to_table я смог разбить value 1 на строки, но не могу поглотить ненужные значения колонки value 2
пример таблицы
Код: plaintext
1.
2.
3.
4.
value1    value2 value3
123,456  100    ABS
789      400    ABS
321      200    SBA
432,567  500    SBA

Интересует результат следующего вида
Код: plaintext
1.
2.
3.
4.
5.
6.
value1    value2 value3
123        100     ABS
456          0     ABS
789        400     ABS
321        200     SBA
432        500     SBA
567          0     SBA
Заранее спасибо!
...
Рейтинг: 0 / 0
Разбить значения после запятой на строки, не отражая в последующих строках значения
    #39640521
grgdvo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kill_spree,

Код: sql
1.
2.
3.
4.
5.
6.
select unnest(value1), unnest(value2), value3 from
(select regexp_split_to_array(value1, E',') as value1, array[value2] as value2, value3 from (values 
('123,456', 100,    'ABS'),
('789',     400,    'ABS'),
('321',     200,    'SBA'),
('432,567', 500,    'SBA')) as t(value1, value2, value3)) t;


вместо 0 будет NULL, но с этим вы уже и сами справитесь.
...
Рейтинг: 0 / 0
Разбить значения после запятой на строки, не отражая в последующих строках значения
    #39641435
Alex URS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
grgdvoKill_spree,

Код: sql
1.
...


вместо 0 будет NULL, но с этим вы уже и сами справитесь.

а у меня вот такой результат получается:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
 unnest | unnest | value3 
--------+--------+--------
 123    |    100 | ABS
 456    |    100 | ABS
 789    |    400 | ABS
 321    |    200 | SBA
 432    |    500 | SBA
 567    |    500 | SBA
(6 rows)



с вашего позволения я немного "модернизировал" селект так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select value1[1], unnest(value2), value3 from
with tbl as (
select regexp_split_to_array(value1, E',') as value1, array[value2] as value2, value3 from (values 
('123,456', 100,    'ABS'),
('789',     400,    'ABS'),
('321',     200,    'SBA'),
('432,567', 500,    'SBA')) as t(value1, value2, value3)
) 
  select value1[1], unnest(value2), value3 from tbl
  union all
  select value1[2], 0, value3 from tbl where value1[2] is not null
...
Рейтинг: 0 / 0
Разбить значения после запятой на строки, не отражая в последующих строках значения
    #39641438
Alex URS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex URS
Код: plsql
1.
2.
select value1[1], unnest(value2), value3 from - это не нужно, случайно скопипейстилось
with tbl as (


нужно так

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with tbl as (
select regexp_split_to_array(value1, E',') as value1, array[value2] as value2, value3 from (values 
('123,456', 100,    'ABS'),
('789',     400,    'ABS'),
('321',     200,    'SBA'),
('432,567', 500,    'SBA')) as t(value1, value2, value3)
) 
  select value1[1], unnest(value2), value3 from tbl
  union all
  select value1[2], 0, value3 from tbl where value1[2] is not null
...
Рейтинг: 0 / 0
Разбить значения после запятой на строки, не отражая в последующих строках значения
    #39642017
grgdvo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex URS,

Хм, оказывает все хитрее. Вот что сделали, начиная с 10 версии PG
автор* Change the implementation of set-returning functions appearing in a
query's SELECT list (Andres Freund)

Set-returning functions are now evaluated before evaluation of scalar
expressions in the SELECT list, much as though they had been placed in
a LATERAL FROM-clause item. This allows saner semantics for cases
where multiple set-returning functions are present. If they return
different numbers of rows, the shorter results are extended to match
the longest result by adding nulls. Previously the results were cycled
until they all terminated at the same time, producing a number of rows
equal to the least common multiple of the functions' periods. In
addition, set-returning functions are now disallowed within CASE and
COALESCE constructs. For more information see Section 37.4.8.

Я запрос писал в 10 версии, вы - очевидно в 9.
И у нас с вами разные результаты :) Черт, какой подвох. Не ожидал.
Ну тогда ваш вариант наверно более предпочтительней, надо посмотреть.
...
Рейтинг: 0 / 0
Разбить значения после запятой на строки, не отражая в последующих строках значения
    #39642775
Kill_spree
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
grgdvo, Спасибо! Решение подошло идеально!
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Разбить значения после запятой на строки, не отражая в последующих строках значения
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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