Этот список дает вам список всех индексов с \n
в вашей строке.Я не уверен, ожидали ли вы этого результата:
demo: db <> fiddle
SELECT
name,
array_remove( -- 5
(array_agg(sum))::int[], -- 4
length(name) + 1
)
FROM (
-- 3
SELECT
name,
SUM(length(lines) + 1) OVER (PARTITION BY name ORDER BY row_number)
FROM (
-- 2
SELECT
*,
row_number() OVER ()
FROM (
-- 1
SELECT
name,
regexp_split_to_table(name, '\n') as lines
FROM problems
)s
)s
) s
GROUP BY name
- Разделение строки в
\n
символах,Каждая разделенная часть теперь является одной строкой во временной таблице. - Добавление
row_count
для обеспечения правильного порядка разделенных частей - Это подсчитывает длину всех отдельных разделенных частей.(Длина + 1) дает позицию
\n
.Оконная функция SUM
суммирует все значения в группе (ваш исходный текст).Вот почему заказ актуален.Например: первые две части "abc \ nde \ nfgh" имеют длины 3 и 2. Таким образом, разрывы находятся в 4 ( abc = 3, + 1) и3 ( de = 2, + 1).Но 3 второй части не является реальным индексом, но если вы суммируете эти значения, вы получите правильные индексы: 4 и 7. - Агрегирование этих результатов
- If (как в моем примере) последний символ всегда равен
\n
, и вас интересует только строка \n
, которую можно удалить из последней записи агрегированного массива.
Изменена проблема в комментариях ниже:
Хотел бы заменить \ n пробелами.Поэтому я думаю, как запрос будет выглядеть в операторе обновления.- Pranav Unde
Замена \n
пробелами - совершенно другая проблема, чем получение индексов для всех вхождений специального символа.И это гораздо проще:
UPDATE problems
SET name = trim(regexp_replace(name, E'\n', ' ', 'g'));
regexp_replace(..., 'g')
находит все вхождения \n
и выполняет замену trim()
, удаляя пробелы до и после строки, если это необходимо(возможно, потому что там был трейлинг \n
, как в моем примере - который также был заменен пробелом на предыдущем шаге)
demo: db <> fiddle