在postgres中找到换行符

时间:2018-12-10 12:17:15

标签: postgresql

数据库表中有几个条目具有多个行“名称”数据。 我尝试从中找到单个换行符。

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

但是对于包含多个换行符(\ n)的数据,它将失败。 一种在名称数据中查找“ \ n”个“ n”个数字的方法。

2 个答案:

答案 0 :(得分:1)

此列表为您提供了字符串中带有\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 window function汇总一个组(您的原始文本)中的所有值。这就是顺序相关的原因。例如:“ abc \ nde \ nfgh” 的前两个部分的长度分别为3和2。因此中断点为4( abc = 3,+ 1 )和3( de = 2,+ 1)。但是第二部分的3不是真正的索引,但是如果您对这些值求和,则会得到正确的索引:4和7。
  4. 汇总这些结果
  5. 如果(例如,在我的示例中)最后一个字符始终是\n,而您仅对\n字符感兴趣,则可以删除聚合数组的最后一个条目。

以下注释中的问题已更改:

  

想用空格替换\ n。所以我在想上面的查询   将在Update语句中查找。 –普拉纳夫·恩德(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

答案 1 :(得分:0)

regexp_matches将为每个匹配项发送一行。 doc

SELECT
   id,
   strpos ( NAME, E'\n' ) AS Position_of_substring
FROM
   problems p
WHERE
   (select count(*) from regexp_matches(p.name,E'\n','g') ) = ?;