如何在PostgreSQL中获取单元格值中换行符的数量

10

假设我有一个名为 bookInfo 的虚构表,其中包含以下值:

|id   |book_name   |description   |
-----------------------------------
|1    |book 1      |dummy         |
|2    |book 2      |harry         |
|     |            |potter        |
|     |            |Part 2        |
|3    |...

第二条记录(id = 2)的description列单元格值包含多个换行符序列,这些序列出现在“harry”和“potter”关键字之间,如下所示:

harry \n potter \n part 2

有没有办法统计description列中换行符的数量,例如执行以下操作:

SELECT (count new line)description FROM bookInfo WHERE id=2;

之前的查询应该返回一个整数值为2

4个回答

4
您可以将带有换行符的字符串长度与不带换行符的字符串长度进行比较。
SELECT (LENGTH(description) - LENGTH(REPLACE(description, '\n', '')) FROM `bookinfo`

修剪后的计数

如果你只想计算两个换行符之间的数量(不包括开头和结尾的换行符),你可以先将其修剪掉。

SELECT (LENGTH(TRIM(BOTH '\n' FROM description)) - LENGTH(REPLACE(TRIM(BOTH '\n' FROM description), '\n', ''))) FROM `bookinfo`

1
我更喜欢这个选项,因为它似乎比REGEX_REPLACE具有更好的性能优势,而且我的表很大。 - NessBird
2
你需要使用CHR(10)代替'/n',请参考https://dev59.com/gFoV5IYBdhLWcg3wmP3p - NessBird

4

一种简单的方法:

SELECT length(regexp_replace(your_field, E'[^\\n]', '', 'g')) from your_table

注意:position()查找第一个匹配项并返回其位置。

-1

你可以在表字段中查找char(13)来寻找回车符。

select * from bookinfo where CHARINDEX(char(13),description)<>0

希望这对你有所帮助。

1
CHARINDEX 似乎不受 PostgreSQL 支持,所以不太行。 - Craig Ringer

-1
您可以使用SQL标准的position函数来实现此功能:
craig=> SELECT position( E'\r' in E'abc\rdef\rghi' );
 position 
----------
        4
(1 row)

或者:

craig=> SELECT position( chr(13) in E'abc\rdef\rghi' );
 position 
----------
        4
(1 row)

8
position函数将返回第一个换行符的位置,而不是它们的数量。请注意,此处强调的是“位置”,而不是“计数”。 - David Boho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接