数据库表中有几个条目具有多个行“名称”数据。 我尝试从中找到单个换行符。
SELECT
id,
strpos ( NAME, E'\n' ) AS Position_of_substring
FROM
problems
WHERE
strpos ( NAME, E'\n' ) > 0;
但是对于包含多个换行符(\ n)的数据,它将失败。 一种在名称数据中查找“ \ n”个“ n”个数字的方法。
答案 0 :(得分:1)
此列表为您提供了字符串中带有\n
的所有索引的列表。我不确定您是否期望得到这样的结果:
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
以确保拆分部分的正确顺序\n
的位置。 SUM
window function汇总一个组(您的原始文本)中的所有值。这就是顺序相关的原因。例如:“ abc \ nde \ nfgh” 的前两个部分的长度分别为3和2。因此中断点为4( abc = 3,+ 1 )和3( de = 2,+ 1)。但是第二部分的3不是真正的索引,但是如果您对这些值求和,则会得到正确的索引:4和7。\n
,而您仅对\n
字符感兴趣,则可以删除聚合数组的最后一个条目。 以下注释中的问题已更改:
想用空格替换\ n。所以我在想上面的查询 将在Update语句中查找。 –普拉纳夫·恩德(Pranav Unde)
用空格替换\n
是一个安静的问题,然后获取所有出现特殊字符的索引。而且要简单得多:
UPDATE problems
SET name = trim(regexp_replace(name, E'\n', ' ', 'g'));
regexp_replace(..., 'g')
查找所有\n
的发生并进行替换trim()
如有必要,可删除字符串前后的空格(可能是因为在我的示例中有结尾的\n
-在前面的步骤中也已替换为空格)答案 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') ) = ?;