split_to_table() по количеству символов и без разделителя

Мне нужно разбить поле varchar на строки заданной длины, но нет разделителя.

Пример:
Значение в поле: 'Field example of varchar'
И я хочу разбить это на строки длиной 5. Результат должен быть:

"Field"
" exam"
"ple o"
"f var"
"char "

Я пробовал этот запрос:

select regexp_split_to_table('Field example of varchar','(.{5})') as x

Но это не работает, возвращает пять пустых строк.


person Antonio Soriano    schedule 11.01.2013    source источник
comment
В любом случае в вашем регулярном выражении нет ничего плохого, почти: regex101.com/r/eP6zT1 — нам придется изменить {5} на {1,5}, чтобы поймать последнюю запись, поскольку длина строки, похоже, не делится без остатка на 5 (это 24).   -  person Firas Dib    schedule 11.01.2013
comment
Проблема в том, что regexp_split_to_table сохраняет данные между разделителями, но не сами разделители. Было бы интересно увидеть решение.   -  person Anton Kovalenko    schedule 11.01.2013


Ответы (2)


Вы можете использовать generate_series().< br> Должно быть значительно быстрее, чем regexp_matches(), поскольку регулярные выражения мощный, но дорогой.

SELECT substring(col, generate_series(1, length(col), 5), 5)
FROM   tbl;

Обратите внимание, что вы не получите ничего ни для одного из представленных решений, если столбец NULL или пуст.

-> SQLfiddle демонстрирует оба варианта рядом друг с другом.

person Erwin Brandstetter    schedule 11.01.2013
comment
струны тоже дорогие - person Jasen; 12.06.2014

Вы можете использовать не regexp_split_to_table, а regexp_matches:

select (regexp_matches('Field example of varchar', E'.{1,5}', 'g'))[1]
person Skiv_mag    schedule 11.01.2013