计算Oracle数据库列中字符串中出现的所有非字母数字字符的出现次数的最佳方法是什么。
当试图找到解决方案时,我意识到我有一个与问题无关的查询,但我注意到我可以修改它以希望解决这个问题。我想出了这个:
SELECT COUNT (*), SUBSTR(TITLE, REGEXP_INSTR(UPPER(TITLE), '[^A-Z,^0-9]'), 1)
FROM TABLE_NAME
WHERE REGEXP_LIKE(UPPER(TITLE), '[^A-Z,^0-9]')
GROUP BY SUBSTR(TITLE, REGEXP_INSTR(UPPER(TITLE), '[^A-Z,^0-9]'), 1)
ORDER BY COUNT(*) DESC;
这可以找到FIRST非字母数字字符,但我想计算整个字符串中的出现次数,而不仅仅是第一次出现的次数。 E. g。目前我的查询分析“a(字符串)”会找到一个左括号,但我需要它来找到一个左括号和一个闭括号。
答案 0 :(得分:5)
有一个模糊的Oracle TRANSLATE函数可以让你这样做而不是regexp:
select a.*,
length(translate(lower(title),'.0123456789abcdefghijklmnopqrstuvwxyz','.'))
from table_name a
答案 1 :(得分:4)
试试这个:
SELECT a.*, LENGTH(REGEXP_REPLACE(TITLE, '[^a-zA-Z0-9]'), '')
FROM TABLE_NAME a
答案 2 :(得分:1)
您发现的最佳选择是使用PL / SQL过程。我认为没有办法创建一个正则表达式,它会像你期望的那样返回多个计数(至少在Oracle中没有)。
解决此问题的一种方法是使用递归查询分别检查每个字符,这可用于为找到的每个字符返回一行。以下示例适用于单行:
with d as (
select '(1(2)3)' as str_value
from dual)
select char_value, count(*)
from (select substr(str_value,level,1) as char_value
from d
connect by level <= length(str_value))
where regexp_instr(upper(char_value), '[^A-Z,^0-9]'), 1) <> 0
group by char_value;