【问题标题】:ORACLE : Return Distinct Values with CommaORACLE:用逗号返回不同的值
【发布时间】:2016-10-15 12:26:12
【问题描述】:

我有一个包含两列标签和位置的表格。

Label                        Location
---------------------------------------
OLR-2873-SSA/GTA              GTA

OLR-2873-SSA/GTA              GTA

OLR-2873-SSA/POW              POW

OLR-2873-SSA/POWGTA           POWGTA

我希望输出像

Lable                                                     Location 
-----------------------------------------------------------------------
OLR-2873-SSA/GTA,OLR-2873-SSA/POW,OLR-2873-SSA/POWGTA      GTA,POW,POWGTA

我想使用正则表达式并得到他的输出。

我试过了

Select 
dbms_lob.substr( ltrim(REGEXP_REPLACE(REPLACE(
         REPLACE(
           XMLAGG(
             XMLELEMENT("A",label )
               ORDER BY label).getClobVal(),
             '<A>',','),
             '</A>',''),'([^,]+)(,\1)+', '\1'),
                  ','),4000,1) label , dbms_lob.substr( ltrim(REGEXP_REPLACE(REPLACE(
         REPLACE(
           XMLAGG(
             XMLELEMENT("A",location )
               ORDER BY location).getClobVal(),
             '<A>',','),
             '</A>',''),'([^,]+)(,\1)+', '\1'),
                  ','),4000,1) LOCATION from table_name. 

但我得到这样的输出

Label                                  Location
----------------
OLR-2873-SSA/GTA,OLR-2873-SSA/POWGTA   GTA,POWGTA

【问题讨论】:

    标签: sql oracle regexp-replace listagg


    【解决方案1】:

    微软 SQL 版本

    DECLARE @Table AS TABLE (Label VARCHAR(25), Location VARCHAR(25))
    
    INSERT INTO @Table (Label, Location) VALUES ('OLR-2873-SSA/GTA','GTA')
       ,('OLR-2873-SSA/GTA','GTA')
       ,('OLR-2873-SSA/POW','POW')
       ,('OLR-2873-SSA/POWGTA','POWGTA')
    
    SELECT
        Label = STUFF(
            (SELECT ',' + Label
            FROM
                @Table t
            FOR XML PATH(''))
            ,1,1,'')
        ,Location = STUFF(
            (SELECT ',' + Location
            FROM
                @Table t
            FOR XML PATH(''))
            ,1,1,'')
    

    基本上,您似乎在寻找串联的字符串,如果您环顾互联网,有几种方法。我使用的一种方法是将行转换为 xml 字符串,其中以逗号开头值且没有列名,然后使用东西来整理第一个逗号。所以FOR XML PATH('') 基本上意味着没有根元素,然后因为没有列名,你也不会得到其他 xml 标签,例如没有&lt;label&gt;&lt;/label&gt;。将定界符添加到列的值中,您现在有一个长定界字符串,您只需要摆脱第一个不需要的定界符。

    【讨论】:

    • 我想要 Oracle 中的答案。
    • 啊,我现在看到了标签,也许在问题中指定也很好。我会留下它,以防其他人正在寻找 MS 版本。
    【解决方案2】:

    试试这个

    WITH TEST_DATA AS (
        SELECT 'OLR-2873-SSA/GTA' AS LABEL, 'GTA' AS LOCATION FROM DUAL
        UNION ALL
        SELECT 'OLR-2873-SSA/GTA' AS LABEL, 'GTA' AS LOCATION FROM DUAL
        UNION ALL
        SELECT 'OLR-2873-SSA/POW' AS LABEL, 'POW' AS LOCATION FROM DUAL
        UNION ALL
        SELECT 'OLR-2873-SSA/POWGTA' AS LABEL, 'POWGTA' AS LOCATION FROM DUAL
    )
    SELECT
        LISTAGG(CASE LABEL_DISTINCT WHEN 1 THEN LABEL END, ',') WITHIN GROUP(ORDER BY 0) AS LABEL,
        LISTAGG(CASE LOCATION_DISTINCT WHEN 1 THEN LOCATION END, ',') WITHIN GROUP(ORDER BY 0) AS LOCATION
    FROM (
        SELECT
            LABEL,
            ROW_NUMBER() OVER(PARTITION BY LABEL ORDER BY 0) AS LABEL_DISTINCT,
            LOCATION,
            ROW_NUMBER() OVER(PARTITION BY LOCATION ORDER BY 0) AS LOCATION_DISTINCT
        FROM
            TEST_DATA
    )
    

    【讨论】:

      猜你喜欢
      • 2020-06-13
      • 1970-01-01
      • 1970-01-01
      • 2012-07-15
      • 2021-03-09
      • 2021-10-06
      • 1970-01-01
      • 2013-05-18
      • 2017-01-14
      相关资源
      最近更新 更多