3

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つの開き括弧が見つかりますが、1つの開き括弧と1つの閉じ括弧を見つけるために必要です。

4

3 に答える 3

5

正規表現の代わりにそれを可能にするあいまいなOracleTRANSLATE関数があります。

select a.*,
       length(translate(lower(title),'.0123456789abcdefghijklmnopqrstuvwxyz','.')) 
from table_name a
于 2011-01-28T18:56:29.867 に答える
4

これを試して:

SELECT  a.*, LENGTH(REGEXP_REPLACE(TITLE, '[^a-zA-Z0-9]'), '')
FROM    TABLE_NAME a
于 2011-01-28T17:48:54.777 に答える
1

ご存知のとおり、最良のオプションはPL/SQLプロシージャを使用することです。期待しているように複数のカウントを返す正規表現を作成する方法はないと思います(少なくとも、Oracleではそうではありません)。

これを回避する1つの方法は、再帰クエリを使用して各文字を個別に調べることです。これを使用して、見つかった各文字の行を返すことができます。次の例は、単一の行に対して機能します。

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;
于 2011-01-31T16:55:19.633 に答える