Postgres с условием подстроки большого столбца char в строки - PullRequest
0 голосов
/ 22 апреля 2020

Проблема: у меня есть ограничения в коде, который я пишу, который не будет читаться в столбцах> 4 Кбайт

Хочу: превратить одну строку в несколько строк с новой максимальной длиной и иметь порядковый номер для держите их в порядке.

Я выполнял это действие в DB2 ранее, используя предложение with и рекурсивный запрос, я пытаюсь преобразовать код для работы с Postgres. У меня не так много Postgres опыта, чтобы узнать, есть ли лучший способ сделать это.

Для начала у меня есть таблица

Create table test_long_text (
   test_id numeric(12,0) NOT NULL,
   long_text varchar(64000)
)

Вот мой запрос пытался написать и не удалось.

WITH RECURSIVE rec(test_id, len, ord, pos) as (
   select test_id, octet_length(long_text), 1, 1 from test_long_text
   union all
   select test_id, len, ord+1, pos+4096 from rec where len >=4096)
select A.test_id, ord, substr(long_text, pos, 4096) from test_long_text A
inner join rec using (test_id)
order by A.test_id, ord

В настоящее время я получаю сообщение об ошибке отрицательной длины подстроки, не допускается или она висит бесконечно.

Ожидаемые результаты: где текст представляет собой фрагменты текста в максимум 4096 байт. притвориться, что AB C - более длинная строка.

+--------------+
| ID |ORD|TEXT |
| 1  |1  |ABC  |
+--------------+
| 2  |1  |ABC  |
+--------------+
| 2  |2  |DEF  |
+--------------+
| 3  |1  |ABC  |
+--------------+
| 3  |2  |DEF  |
+--------------+
| 3  |3  |GHI  |
+--------------+

1 Ответ

1 голос
/ 22 апреля 2020

В этом примере показано, как разбить значения текстового столбца на части из 3 символов:

with t(x) as (values('1234567890abcdef'::text), ('qwertyuiop'))
select *, substring(x, f.p, 3)
from t, generate_series(1, length(x), 3) with ordinality as f(p, i);
┌──────────────────┬────┬───┬───────────┐
│        x         │ p  │ i │ substring │
├──────────────────┼────┼───┼───────────┤
│ 1234567890abcdef │  1 │ 1 │ 123       │
│ 1234567890abcdef │  4 │ 2 │ 456       │
│ 1234567890abcdef │  7 │ 3 │ 789       │
│ 1234567890abcdef │ 10 │ 4 │ 0ab       │
│ 1234567890abcdef │ 13 │ 5 │ cde       │
│ 1234567890abcdef │ 16 │ 6 │ f         │
│ qwertyuiop       │  1 │ 1 │ qwe       │
│ qwertyuiop       │  4 │ 2 │ rty       │
│ qwertyuiop       │  7 │ 3 │ uio       │
│ qwertyuiop       │ 10 │ 4 │ p         │
└──────────────────┴────┴───┴───────────┘

Вы можете просто адаптировать его к своим данным.

...