2014-12-22 246 views
1

我有表3行例子:分割字符串

|-Id-||--props--| 
1  aa = black 
2  aa = change 
     d = eexplore 
3  xxx = yield 
     d = int 
     mmmm = no 

我想寫與結果的SQL語句:

aa  
d 
xxx 
mmm 

即輸出x = y的所有第一個元素。給定表的每一行中的配對可以用newline分開。

我試過下面的SQL,但結果不正確

SELECT REGEXP_SUBSTR ('a = b, b = c', 
          '[^=]', 
          1, 
          LEVEL) as name 
     FROM DUAL 
CONNECT BY LEVEL <= (SELECT REGEXP_COUNT ('a = b, b = c', '=') FROM DUAL) 

回答

1

請嘗試以下時,SQL小提琴here

with names as ( SELECT REGEXP_SUBSTR (regexp_replace('aa = b, bb = c , eee = d','[[:space:]]*',''), '[^=]+', 1, level) as name FROM DUAL CONNECT BY LEVEL <= (SELECT REGEXP_COUNT ('a = b, b = c , e = d ', '=') FROM DUAL)) select nvl(regexp_substr(name,'[^,]+',1,2),regexp_substr(name,'[^,]+',1,1)) from names;

Update1:​​ - 您可以用逗號替換新行

在Unix上,LINEFEED(chr(10))是「行尾」標記。 在窗戶回車/換行(CHR(13)|| CHR(10))應行標記結束

with names as 
(
SELECT REGEXP_SUBSTR (regexp_replace(replace('aa = black' ||chr(13)||chr(10)||'bb = change'||chr(13)||chr(10)||'mmmm=no',chr(13)||chr(10),','),'[[:space:]]*',''), 
          '[^=]+', 
          1, 
         level) as name 
     FROM DUAL 
CONNECT BY LEVEL <= (SELECT REGEXP_COUNT 
('aa = black' ||chr(13)||chr(10)||'bb = change'||chr(13)||chr(10)||'mmmm=no', '=') 
FROM DUAL) 

) 
select nvl(regexp_substr(name,'[^,]+',1,2), 
regexp_substr(name,'[^,]+',1)) from names; 
+0

謝謝。您的解決方案適用於以逗號分隔的示例。 (如在我的問題SQL),但我需要'換行'分隔的例子。 – Tony

+1

提供了處理換行符的更新 – psaraj12

+0

另一個使用您的答案的問題是http://stackoverflow.com/q/27602170/2023524。 – Tony

0

使用substr返回的第一個字符:

select substr(LEVEL, 1, 1) from tablename group by substr(LEVEL, 1, 1) 
+0

謝謝您的回答。但第一個單詞的名稱可以包含多個字符。我已經更新了我的問題。 – Tony