2015-01-12 83 views
-2

我已經經歷了許多問題,並且找不到我正在查找的內容。 假設我有一個表,如下所示:在Oracle SQL中計算逗號分隔的所有列的值

Col1  Col2  Col3 
1,2,3  2,3,4,5,1 5,6 

我需要得到結果使用SELECT語句如下:

Col1  Col2  Col3 
1,2,3  2,3,4,5,1 5,6 
3   5   2 

注意添加第三列是逗號的數分隔值。 查找單列的計數很簡單,但這似乎很難,如果不是不可能的話。 在此先感謝。

+2

不要在列中存儲像逗號分隔值這樣的數據,它只會導致問題...順便說一句,你已經添加了一行,而不是一列。 – jarlh

+3

'mysql'或'oracle'那些是兩個非常不同的DBMS。 @jarlh:我認爲你的評論的答案是「我沒有這樣設計,我只需要處理它」。因爲沒有人創建這樣的設計實際上必須使用它。 –

+0

是@jarlh,我還能如何獲取多列的計數值。我發現在答案[這裏](http://stackoverflow.com/questions/27901978/count-comma-separated-values-of-all-columns-in-oracle-sql)如何做一列。但是我有多個列,我不想寫多個查詢。 –

回答

2
select 
col1, 
regexp_count(col1, ',') + 1 as col1count, 
col2, 
regexp_count(col2, ',') + 1 as col2count, 
col3, 
regexp_count(col3, ',') + 1 as col3count 
from t 

FIDDLE

FIDDLE2

+0

這隻能得到計數,我也需要數據。但是你的回答給了我一個關於如何去做的不同想法。感謝那。 –

+0

@RJDoe在那裏還有一個小提琴,就是這樣。 – Mihai

+1

感謝您的幫助,已經投票答覆爲正確答案。 Thansk再次。 –

1

尋找單個列計數很簡單,但是這似乎很難,如果不是不可能的。

所以你不要手動查找每一列?你想要它動態。

設計實際上有缺陷,因爲它違反了標準化。但是如果您願意繼續使用它,那麼您可以使用REGEXP_COUNT以PL/SQL的方式執行此操作。

喜歡的東西,

SQL> CREATE TABLE t AS 
    2 SELECT '1,2,3' Col1, 
    3 '2,3,4,5,1' Col2, 
    4 '5,6' Col3 
    5 FROM dual; 

Table created. 

SQL> 
SQL> DECLARE 
    2 cnt NUMBER; 
    3 BEGIN 
    4 FOR i IN 
    5 (SELECT column_name FROM user_tab_columns WHERE table_name='T' 
    6 ) 
    7 LOOP 
    8  EXECUTE IMMEDIATE 'select regexp_count('||i.column_name||', '','') + 1 from t' INTO cnt; 
    9  dbms_output.put_line(i.column_name||' has cnt ='||cnt); 
10 END LOOP; 
11 END; 
12/
COL3 has cnt =2 
COL2 has cnt =5 
COL1 has cnt =3 

PL/SQL procedure successfully completed. 

SQL> 

也許,還會有SQL本身XML的解決方案,而無需使用PL/SQL

在SQL -

SQL> WITH DATA AS 
    2 (SELECT '1,2,3' Col1, '2,3,4,5,1' Col2, '5,6' Col3 FROM dual 
    3 ) 
    4 SELECT regexp_count(col1, ',') + 1 cnt1, 
    5 regexp_count(col2, ',')  + 1 cnt2, 
    6 regexp_count(col3, ',')  + 1 cnt3 
    7 FROM t; 

     CNT1  CNT2  CNT3 
---------- ---------- ---------- 
     3   5   2 

SQL> 
2

Count the number of elements in a comma separated string in Oracle一個簡單的方法做,這是count the number of commas然後加1

你只需要結果被聯合到的原始數據。那麼,這樣做:

SQL> with the_data (col1, col2, col3) as (
    2 select '1,2,3', '2,3,4,5,1', '5,6' from dual 
    3  ) 
    4 select a.* 
    5 from the_data a 
    6 union all 
    7 select to_char(regexp_count(col1, ',') + 1) 
    8  , to_char(regexp_count(col2, ',') + 1) 
    9  , to_char(regexp_count(col3, ',') + 1) 
10 from the_data; 

COL1 COL2  COL 
----- --------- --- 
1,2,3 2,3,4,5,1 5,6 
3  5   2 

您需要將結果轉換爲字符,因爲你unioning一個字符爲數字,甲骨文會抱怨。

值得注意的是,以這種方式存儲數據違反了第一範式。這使得操作困難得多,幾乎不可能限制正確。值得考慮的是規範化你的數據模型,以使其和其他查詢更簡單。

+0

啊! @Ben,這一次我很快......大聲笑;-)我離開了'工會'位OP找出。 –