2009-10-19 53 views
0

我有一个字符串。让我们说:“abcdea” 我必须找出什么是使用匿名pl/sql块在这个字符串中使用最多的字母。PL/SQL - 使用字符串!

我该怎么做?

+1

这是PL/SQL的一个不寻常的任务 - 我可能会问为什么你在数据库上做这个吗? – Kobi 2009-10-19 08:50:42

回答

0

创建一个表

create table charcount (c char(1)) 

分割字符串成单个字符,并将其插入到使用PL/SQL此表。答案是那么第一行的:

select c, count(1) 
from charcount 
group by c 
order by count(1) desc 
2

也许不是完美的优雅,但仍然工作:

declare 
str varchar2(6 char) := 'abcdea'; 
alphabet varchar2(26 char) := 'abcdefghijklmnopqrstuvwxyz'; 
most_frequent char := ''; 
max_count INTEGER := 0; 
v_count INTEGER := 0; 
checking CHAR := ''; 
begin 
for i in 1..26 loop 
     checking := SUBSTR(alphabet, i, 1); 
     for k in 1..length(str) 
     loop 
      if SUBSTR(str, k, 1) = checking THEN 
      v_count := v_count + 1; 
      end if; 
     end loop; 
     if v_count > max_count THEN 
      max_count := v_count; 
      most_frequent := checking; 
     end if; 
     v_count :=0; 
end loop; 
dbms_output.put_line('Most frequent letter is "'|| most_frequent||'"'); 
end; 
+0

+1 - 我喜欢这个解决方案。 @cc - 请注意,上述解决方案仅适用于小写字符串。使用“如果SUBSTR(LOWER(str),k,1)=检查THEN”来执行不区分大小写的搜索。 – darreljnz 2009-10-20 09:18:19

0

下面是使用一对夫妇SYS类型的解决方案:

declare 
    str varchar2(6) := 'abcdea'; 
    tab AWRDRPT_TEXT_TYPE_TABLE := AWRDRPT_TEXT_TYPE_TABLE(); 
begin 
    for i in 1..length(str) loop 
    tab.extend(1); 
    tab(i) := AWRDRPT_TEXT_TYPE (substr(str,i,1)); 
    end loop; 
    for r in (select output, count(*) as cnt 
      from table(tab) 
      group by output 
      order by cnt desc) 
    loop 
    dbms_output.put_line(r.output); 
    exit; 
    end loop; 
end; 
2

的关联数组非常方便地存储计数:

DECLARE 
    TYPE t_counts IS TABLE OF PLS_INTEGER INDEX BY VARCHAR2(1); 
    -- 
    v_counts t_counts; 
    v_string VARCHAR2(100) := 'the quick brown fox jumped over the lazy dog'; 
    v_char VARCHAR2(1); 
BEGIN 
    FOR i IN 1 .. length(v_string) LOOP 
     v_char := substr(v_string, i, 1); 
     IF NOT v_counts.exists(v_char) THEN 
      v_counts(v_char) := 0; 
     END IF; 
     v_counts(v_char) := v_counts(v_char) + 1; 
    END LOOP; 
END; 
/

寻找具有最高计数的数组中的索引将是微不足道的添加

0

有可能不PL/SQL纯SQL

declare 
    l_string varchar2(1000) := 'asddafsbaterbtretbbfdsbgdfsgnrtynrthfhfghntumfyuy'; 
    l_char char(1); 
begin 
    with t as 
    (select l_string as str from dual) 
    select c 
     into l_char 
     from (select substr(str, level, 1) as c, count(*) as cnt 
       from t 
      connect by level <= length(str) 
      group by substr(str, level, 1) 
      order by 2 desc) 
    where rownum < 2; 
    dbms_output.put_line('Most used char is ' || l_char); 
exception 
    when no_data_found then 
     dbms_output.put_line('Sorry string is empty'); 
end;