2014-12-05 66 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(小寫)字母。