2017-02-15 21 views
-1

文字列中の各文字の数が必要です。
例:与えられた文字列中の各文字の数

SELECT ('aabcccdee') from dual; 

結果:事前に

a(1),b(2), c(3), d(1),e(2). 

感謝。

+2

ITSは、一般的に、あなたがしようとしたか、研究しているかを示すのが良いと考えました。 http://stackoverflow.com/help/how-to-ask – BriteSponge

答えて

4

階層クエリを使用すると、文字列を個々の文字に分割できます。これはちょうどあなたの例の値を供給するCTEを使用している:

with t (value) as (
    select 'aabcccdee' from dual 
) 
select a_char, count(*) a_count 
from (
    select substr(value, level, 1) as a_char 
    from t 
    connect by level <= length(value) 
) 
group by a_char 
order by a_char; 

A_CH A_COUNT 
---- ---------- 
a    2 
b    1 
c    3 
d    1 
e    2 

そして、あなたがにしている場合は、(listagg()を使用することができます。

with t (value) as (
    select 'aabcccdee' from dual 
) 
select substr(value, level, 1) as a_char 
from t 
connect by level <= length(value); 

次に、あなたがかもしれ回、それぞれがどのように表示されるかをカウントする集計を使用することができますそれはあなたが本当に欲しいものだ場合は単一の文字列にこれらの文字とカウントを集計するために11グラム以上):

with t (value) as (
    select 'aabcccdee' from dual 
) 
select listagg(a_char || '(' || count(*) || ')', ',') within group (order by a_char) 
from (
    select substr(value, level, 1) as a_char 
    from t 
    connect by level <= length(value) 
) 
group by a_char; 

LISTAGG(A_CHAR||'('||COUNT(*)||')',',')WITHINGROUP(ORDERBYA_CHAR) 
----------------------------------------------------------------- 
a(2),b(1),c(3),d(1),e(2) 

あなたが特にPL/SQLでこれを行うにしたい場合 - あなたは私を重視するのでおそらく、すでにPL/SQL変数でS - あなたはコンテキストスイッチと同じことを行うことができます

set serveroutput on 
declare 
    l_value varchar2(30) := 'aabcccdee'; 
    l_result varchar2(100); 
begin 
    select listagg(a_char || '(' || count(*) || ')', ',') within group (order by a_char) 
    into l_result 
    from (
    select substr(l_value, level, 1) as a_char 
    from dual 
    connect by level <= length(l_value) 
) 
    group by a_char; 

    dbms_output.put_line(l_result); 
end; 
/

a(2),b(1),c(3),d(1),e(2) 

PL/SQL procedure successfully completed. 
+0

クエリが余分な要件として構築される方法をよく見ています。 – BriteSponge

+0

これは素晴らしいアレックスです。あなたは誰にも他の方法で答えられるような範囲を与えませんでした。 +1 – XING

関連する問題