【问题标题】:Split string in Oracle DB在 Oracle DB 中拆分字符串
【发布时间】:2014-12-22 08:34:44
【问题描述】:

例如,我有 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)

【问题讨论】:

    标签: sql oracle split


    【解决方案1】:

    请试试下面的 sql fiddle 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)) 是“行尾”标记。 在 windows 回车/LINEFEED (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;
    

    【讨论】:

    【解决方案2】:

    使用substr 返回第一个字符:

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

    【讨论】:

    • 感谢您的回答。但是第一个单词的名称可以包含多个字符。我已经更新了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    • 2013-10-24
    • 2021-11-17
    • 2015-07-23
    相关资源
    最近更新 更多