在Oracle SQL中计算一个字符出现的次数

7
我该如何在Oracle中统计某列中特定字符出现的次数?例如,如果我有一个名为FOO的表格,其中包含像a,ABC,def2,3,4,5这样的数据,我想要统计逗号出现的次数。
CREATE TABLE foo (
  str varchar2(30)
);

INSERT INTO foo VALUES( 'a,ABC,def' );
INSERT INTO foo VALUES( '2,3,4,5' );
commit;

我想要的输出是:
str         cnt
a,ABC,def   2
2,3,4,5     3

使用PL/SQL,我已经得到了。 - Sharath
无法使用Oracle SQL。 - Sharath
请尝试使用此链接中的选项:https://blogs.oracle.com/aramamoo/entry/how_to_split_comma_separated_string_and_pass_to_in_clause_of_select_statement - premnathcs
2个回答

30

通常用于此目的的一个技巧是使用 lengthreplace 的组合:

select (length(your_col) - length(replace(your_col, ','))) from your_table;

replace函数如果不带第三个参数,将只会删除字符。


22

根据您的 Oracle 版本(regexp_count 在 11.1 中引入),我倾向于做一些更清晰的事情:

SELECT regexp_count( <<column_name>>, ',' )
  FROM <<table_name>>

你可以通过表格看到。

SQL> ed
Wrote file afiedt.buf

  1  select str, regexp_count( str, ',' )
  2*   from foo
SQL> /

STR                            REGEXP_COUNT(STR,',')
------------------------------ ---------------------
a,ABC,def                                          2
2,3,4,5                                            3

1
@Sharath:我认为这个问题应该在stackoverflow上有一个不同的问题... [http://stackoverflow.com/questions/6042568/difference-between-strong-and-weak-ref-cursor-in-oracle] - Gaurav Soni
仅适用于Oracle数据库11g+ - BaSsGaz
1
嗨,当我尝试执行 select regexp_count('AB|C|D%E','|') from dual; 时,它返回了9。为什么会对管道符号发生这种情况? - Mistu4u
@Mistu4u,你需要转义管道符号,因为它是正则表达式中的保留字符(句点和其他字符也是如此):select regexp_count('AB|C|D%E','\|') from dual; - Matt

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