2012-09-13 103 views
0

SQL新手。使用oracle sql developer版本3.1.07。有什麼方法來分離包含像一串字符串列的元素:SQL:使用分隔符值拆分字符串

dublin.ie;montreal.com;paris.com 

我想基礎上,;這樣我就可以單獨操縱他們分裂他們(爲表的每一行這樣做)。這是因爲我想刪除以.com結束的所有內容,但不影響其他內容。

我想使用最基本的SQL我可以,因爲我是相當新手,我使用相當舊的版本。

任何想法?再次感謝你們。迄今爲止的幫助非常棒。

+0

可能重複http://stackoverflow.com/questions/4004377/splitting-comma-separated-string-in-a-pl-sql -stored-proc) – Taryn

回答

2

我想說表格結構非常糟糕 - 每個域名都應該有一行。對於初學者來說,這將給解決方案帶來很大困難。

你需要一段sql來爲存儲在每個域中的每個域創建一行;分隔列表。

所以dublin.ie; montreal.com; paris.com; bristol.uk

變爲: -

dublin.ie 
montreal.com 
paris.com 
bristol.uk 

再沒有.COM行綁定回單行,得到

dublin.ie; bristol.uk 

我有一個類似的問題 - 我有一個字段,包含逗號分隔的國家代碼。 我正在爲通用國家/地區工作的報告用戶。我有一個包含國家代碼和國家名的國家表,但逗號分隔的列表不會加入到它,因爲它具有「GB,FR,IT」,其中國家表具有「英國」的「GB」等上。

我解決了這個問題,方法是爲每個逗號分隔值創建一行(在內存中),將這些行連接到COUNTRY表中,返回國家名稱,然後將國家名稱綁定到一行中,像這樣: -

「英國,法國,意大利」。

下面是我使用的代碼 - 它不適合初學者。您可能想嘗試使用REPLACE和INSTR以及SUBSTR,但您需要事先知道每個字段包含多少條目,否則您可能需要使用PLSQL在循環內工作。

如果我是你,我會問DBA(如果可能的話)正確地構造數據,以便字段包含原子值,而不是數組的值。

SELECT ROW_SPLIT.CONTRACT_ID, 
    WM_CONCAT(ROW_SPLIT.COUNTRY_NAME) AS COUNTRY_LIST 
    FROM 
    (SELECT PQ.ID AS CONTRACT_ID, 
     PQ.COUNTRY_CODE, 
     COUT.TEXT AS COUNTRY_NAME 
    FROM 
     (SELECT ID, 
     extract(value(d), '//row/text()').getStringVal() AS COUNTRY_CODE 
     FROM 
     (SELECT ID, 
      XMLTYPE('<rows><row>' 
      || REPLACE(EXCLUDED_NATIONALITIES, ',', '</row><row>') 
      || '</row></rows>') AS xmlval 
     FROM PROPERTY_CONTRACT 
     ) x, 
     TABLE(xmlsequence(extract(x.xmlval, '/rows/row'))) d 
    ) PQ 
    JOIN COUNTRY C 
    ON C.CODE = PQ.COUNTRY_CODE 
    LEFT OUTER JOIN TEXT COUT 
    ON C.CODE   = COUT.CODE 
    AND COUT.CATEGORY = 'COUNTRY' 
    AND COUT.LANGUAGE = 'en' 
    ORDER BY PQ.ID, 
     COUT.TEXT 
    ) ROW_SPLIT 
    GROUP BY ROW_SPLIT.CONTRACT_ID; 
[在一個PL/SQL存儲過程分裂逗號分隔的字符串(的
+0

謝謝史蒂夫,我知道正在使用的數據庫並不理想。另一個存儲這些表將是最好的解決方案。不幸的是,我們正在將一個系統與稱爲IQMS的數據庫結合使用,無論出於何種原因都無法支持這個數據庫(因此無論如何DBA都這麼說)。所以我想我可以做的事是:1.用';'分隔字符串2.將這些臨時存儲在內存中3.刪除該行中的.com任何內容4.將剩餘的行連接成一個字符串並將其放回原始行。你認爲這是完成這項任務的合理途徑嗎?再次感謝!欣賞它! –

+0

是的,最好重構memort中的數據,刪除行,然後將它們拼接回字符串並更新原始行。祝你好運! – Steve