2014-12-05 52 views
1

我想使用select查询单独实现下面的代码片段o/p。有没有可能不使用正则表达式?使用SQL仅显示字符串中重复的字符数

Character Count when string input is dynamic. 

    DECLARE 
     str  VARCHAR2(255); 
     lv_val NUMBER; 
     lv_char CHAR(1); 
     lv_unq VARCHAR2(255); 
    BEGIN 
     str:= :p_string; 
     FOR i IN 1..length(str) 
     LOOP 
     lv_val := 0; 
     lv_char := SUBSTR(str,i,1); 
     IF instr(lv_unq,lv_char)>0 THEN 
      NULL; 
     ELSE 
      lv_unq := lv_unq||lv_char; 
      lv_val := ((LENGTH(str) - LENGTH(REPLACE(replace(str,' ',''), lv_char, '')))/LENGTH(lv_char)); 
      --select ((length(str) - LENgth(REPLACE(str, lv_char, '')))/LENgth(lv_char)) into lv_val FROM dual; 
      DBMS_OUTPUT.PUT_LINE('Character '||lv_char || ' is repeated :'||lv_val||' times in the string '||str); 
     END IF; 
     END LOOP; 
    END; 
+3

如果您显示示例字符串和预期输出会更好。 – Noel 2014-12-05 14:40:20

回答

1

回答这个问题的标题:

使用SQL字符串中的重复的字符的显示计数仅

with v as (select substr('hello world', level, 1) c from dual connect by level < 12), 
    d as (select chr(ascii('a')+level-1) c from dual connect by level <= 26) 

select d.c, count(v.c) from d left join v on d.c = v.c 
group by d.c 
order by d.c; 

的结果

第一见http://sqlfiddle.com/#!4/d41d8/38321/0视图将您的字符串拆分为字符。第二种观点只是字母表。一旦你有两个意见,你只需要一个简单的left joingroup by子句来计算匹配事件的数量。

请注意:在第一观看

  • ,字符串和它的长度是硬编码在这个例子中
  • 我承担所有的字符都是小写
  • 我只考虑到ASCII编码的26(小写)字母。