Oracle:一个查询,它计算字符串中所有非字母数字字符的出现次数

Posted

技术标签:

【中文标题】Oracle:一个查询,它计算字符串中所有非字母数字字符的出现次数【英文标题】:Oracle: a query, which counts occurrences of all non alphanumeric characters in a string 【发布时间】:2011-01-28 17:44:42 【问题描述】:

对出现在 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;

这可以找到第一个非字母数字字符,但我想计算整个字符串中的出现次数,而不仅仅是第一次出现。例如。目前我的查询分析“a(字符串)”会找到一个左括号,但我需要它来找到一个左括号和一个右括号。

【问题讨论】:

不幸的是,我需要能够找到每个符号的出现次数,有没有人对此有任何想法?我试图在我的问题的最后一段中说明这一点。 您需要非字母数字字符的计数还是每个非字母数字字符的计数?例如,对于字符串“(1(2)3)”,您希望结果为 4 还是以某种方式指示 2“(”和 2“)”? @Allan 是 2 (和 2 ),但是我决定为我编写一个快速的 pl-sql 程序来执行此操作,因为速度不是一个大问题(我只是打算运行这个一次用于设计目的),所以这不再是一个问题。 【参考方案1】:

有一个不起眼的 Oracle TRANSLATE 函数可以让您这样做,而不是正则表达式:

select a.*,
       length(translate(lower(title),'.0123456789abcdefghijklmnopqrstuvwxyz','.')) 
from table_name a

【讨论】:

【参考方案2】:

试试这个:

SELECT  a.*, LENGTH(REGEXP_REPLACE(TITLE, '[^a-zA-Z0-9]'), '')
FROM    TABLE_NAME a

【讨论】:

【参考方案3】:

正如您所发现的,最好的选择是使用 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;

【讨论】:

以上是关于Oracle:一个查询,它计算字符串中所有非字母数字字符的出现次数的主要内容,如果未能解决你的问题,请参考以下文章

在 Oracle SQL Developer 中识别非空表

oracle查询一个字符串中有字母

Oracle查询数据库中所有表的记录数

Oracle 替换一些重复的字符(非数字)

oracle中怎么判断查询的列中是不是包含字母?

从 lua 字符串中删除所有非字母数字字符