2017-02-14 145 views
-2

我有作爲值如下字符串:逗號分隔字符串列表

Countries = USA, Canada, Italy 

我想它們分開,並顯示爲列表類似下面

Countries 
USA 
Canada 
Italy 

我該怎麼做使用SQL?

+0

@a_horse_with_no_name這個問題不是這個問題的重複 - 是的,最初的部分是相似的,但是那個問題的OP想要對項目進行分組和計數 - 接受的答案會生成太多的行來正確回答這個問題然後使用'COUNT()'來忽略NULL值來獲得該問題的答案。是的,這可能應該作爲重複關閉,但不能與該目標關聯。 – MT0

+0

更好的重複(但我們無法鏈接到文檔頁面):http://stackoverflow.com/documentation/oracle/1968/splitting-delimited-strings#t=201702141232438006307 – MT0

+0

另一個重複 - http:// stackoverflow。 com/questions/17419160/connect-by-to-generate-rows-from-multiple-delimited-string – MT0

回答

0

您可以通過

select regexp_substr('USA, Canada, Italy','[^,]+', 1, level) from dual 
    connect by regexp_substr('USA, Canada, Italy', '[^,]+', 1, level) is not null; 
+0

但國家並非一直是靜態的......它可能會改變用戶到另一個.. 順便說一句「 - 員工自定義屬性」.TEXT_0是我的colomn標題。 我想用逗號分隔符顯示這個列表中的任何值。 謝謝, –

+0

這隻適用於單行數據 - 當存在多個輸入行時,'CONNECT BY'子句將開始在行之間生成連接,並且會生成許多許多重複的行。 – MT0

1

使用regex_substr和連接有發佈Oracle文檔頁面的Splitting Delimited Strings主題的多種解決方案。

一個是:

示例數據

CREATE TABLE table_name (id, list) AS 
SELECT 1, 'a,b,c,d' FROM DUAL UNION ALL -- Multiple items in the list 
SELECT 2, 'e'  FROM DUAL UNION ALL -- Single item in the list 
SELECT 3, NULL  FROM DUAL UNION ALL -- NULL list 
SELECT 4, 'f,,g' FROM DUAL;   -- NULL item in the list 

查詢

SELECT t.id, 
     v.COLUMN_VALUE AS value, 
     ROW_NUMBER() OVER (PARTITION BY id ORDER BY ROWNUM) AS lvl 
FROM table_name t, 
     TABLE(
     CAST(
      MULTISET(
      SELECT REGEXP_SUBSTR(t.list, '([^,]*)(,|$)', 1, LEVEL, NULL, 1) 
      FROM DUAL 
      CONNECT BY LEVEL < REGEXP_COUNT(t.list, '[^,]*(,|$)') 
      ) 
      AS SYS.ODCIVARCHAR2LIST 
     ) 
     ) v; 

輸出

 ID ITEM   LVL 
---------- ------- ---------- 
     1 a    1 
     1 b    2 
     1 c    3 
     1 d    4 
     2 e    1 
     3 (NULL)   1 
     4 f    1 
     4 (NULL)   2 
     4 g    3