найти новые строки персонажа в postgres - PullRequest
0 голосов
/ 10 декабря 2018

Наличие пары записей в таблице базы данных, которые имеют многострочные «имена» данных.Я пытаюсь найти один символ новой строки из него.

SELECT
   id,
   strpos ( NAME, E'\n' ) AS Position_of_substring
FROM
   problems
WHERE
   strpos ( NAME, E'\n' ) > 0;

Но это не удается для данных, которые имеют более 1 символа новой строки (\ n).ЛЮБОЙ способ найти «n» число «\ n» в именах данных.

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Этот список дает вам список всех индексов с \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
  1. Разделение строки в \n символах,Каждая разделенная часть теперь является одной строкой во временной таблице.
  2. Добавление row_count для обеспечения правильного порядка разделенных частей
  3. Это подсчитывает длину всех отдельных разделенных частей.(Длина + 1) дает позицию \n.Оконная функция SUM суммирует все значения в группе (ваш исходный текст).Вот почему заказ актуален.Например: первые две части "abc \ nde \ nfgh" имеют длины 3 и 2. Таким образом, разрывы находятся в 4 ( abc = 3, + 1) и3 ( de = 2, + 1).Но 3 второй части не является реальным индексом, но если вы суммируете эти значения, вы получите правильные индексы: 4 и 7.
  4. Агрегирование этих результатов
  5. If (как в моем примере) последний символ всегда равен \n, и вас интересует только строка \n, которую можно удалить из последней записи агрегированного массива.

Изменена проблема в комментариях ниже:

Хотел бы заменить \ n пробелами.Поэтому я думаю, как запрос будет выглядеть в операторе обновления.- Pranav Unde

Замена \n пробелами - совершенно другая проблема, чем получение индексов для всех вхождений специального символа.И это гораздо проще:

UPDATE problems  
SET name = trim(regexp_replace(name, E'\n', ' ', 'g'));
  1. regexp_replace(..., 'g') находит все вхождения \n и выполняет замену
  2. trim(), удаляя пробелы до и после строки, если это необходимо(возможно, потому что там был трейлинг \n, как в моем примере - который также был заменен пробелом на предыдущем шаге)

demo: db <> fiddle

0 голосов
/ 10 декабря 2018

regexp_matches будет выдавать строки для каждого матча. документ

SELECT
   id,
   strpos ( NAME, E'\n' ) AS Position_of_substring
FROM
   problems p
WHERE
   (select count(*) from regexp_matches(p.name,E'\n','g') ) = ?;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...