在Oracle中,统计逗号分隔的字符串中元素的数量

7

假设我有一张表,其中Col2是varchar类型

Col1 Col2
1    001,002
2    003,004,005

我需要计算Col2中元素的数量,并将其返回,如果我这样做:
select --do something here with column-- from table

它将给我:

2
3 
3个回答

21
所以,通过计算 Col2 中 , 的数量并将其加1,即可得到答案。以下代码获取 Col2 的长度,然后将其中的,替换为空格并获取新长度。将第一个长度减去第二个长度,即可得到逗号的总数。最后只需在结果上加1,即可得到您要寻找的总数:
SELECT (LENGTH(Col2) - LENGTH(REPLACE(Col2,",","")) + 1) AS MyCol2Count
FROM MyTable

使用这个代码,出现了```ERROR: function length(jsonb) does not exist LINE 1: SELECT (LENGTH(recipients) - LENGTH(REPLACE(recipients,","))...新手问题,Postgres不支持Length函数吗? - Joshua Dance
2
是的,PostgreSQL确实支持length函数。请参阅字符串函数和运算符。看一下这个SQL Fiddle。在Postgre中,您需要使用单引号而不是我在答案中显示的双引号。 - Linger
如何更改才能在MSSQL中使用它? - Duffer
使用 LEN(Col2)-LEN(REPLACE(col2,';','')) 在 MSSQL 中使事情正常运作。 - Duffer

14

如果它始终是以那种方式格式化的,只需计算逗号的数量,然后加1:

select regexp_count(col, ',') + 1
  from table

2

如果Col2为空,Linger的答案是不正确的。这样,你将得到一个错误的计数1,而不是0。你可以使用以下CASE语句来处理这种特殊情况:

SELECT CASE WHEN Col2='' THEN 0 ELSE LENGTH(Col2)-LENGTH(REPLACE(Col2,",",""))+1 END AS MyCol2Count
FROM MyTable

编辑:正如William指出的那样,如果您的表允许空值,则空字符串WHEN测试可能不准确。在这种情况下,您需要用Col2 IS NULL替换Col2=''测试(至少在SQL Server中)。

注意:抱歉,我本来想将此作为对Linger答案的评论,但我还没有被允许发表评论。


1
在Oracle中,Col2=''永远不会为真,因为空字符串只是空值。 - William Robertson
很好的观点。在SQL Server中也可能是这样的。我会编辑我的答案来反映这一点。 - Mod Bern

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