代码之家  ›  专栏  ›  技术社区  ›  deepakguna

如何使用connect by将逗号分隔的值拆分为列

  •  0
  • deepakguna  · 技术社区  · 4 年前

    我有一个专栏的长度小于<50个逗号分隔的值。并且该特定列中逗号分隔值的数量不是恒定的,我想使用in/And/OR子句查询此表以获取这些逗号分隔值:

    所以我想:

    • 在选择查询中将这些值拆分为单独的列
    • 使用AND、OR和IN查询某人的市场代码:
      • EUP和APCAC
      • 亚太地区或欧盟或加利福尼亚州
      • IN(亚太经合组织、欧盟、拉丁美洲)

    我必须在spring数据jpa原生查询中使用此查询

    我不想使用那么多的substr。

    在参考了以下答案后,我认为通过使用connect-by和level来实现这一点会很有用- ans1 ans2

    用户表:

    用户名 市场代码 使用中
    厕所 eup、apac、Latim 0
    塞巴斯蒂安 拉丁语 0
    泽维尔 ca、apac、Latim 0

    然而,下面只返回一行,而我原本预计有3行:

    select regexp_substr(market_code,'[^|]+', 1, level) from testautomadm.userpool
    where  AND USERNAME = 'john'
    connect by regexp_substr('market_code', '[^|]+', 1, level)  
    is not null
    

    非常感谢对解决此用例的任何帮助。

    非常感谢。

    1 回复  |  直到 4 年前
        1
  •  1
  •   Popeye    4 年前

    您可以使用 multiset 层次查询如下:

    Select user_name, 
           listagg(market_code, ',') within group (order by pos) as market_code,
           In_use
      From
    (Select user_name, 
           regexp_substr(market_code, '[^,]+',1, column_value) as market_code, 
           in_use,
           column_value as pos
      From t,
           table(cast(multiset(
             select level from dual 
             connect by level <= length (regexp_replace(t.market_code, '[^,]+'))  + 1
            ) as sys.OdciNumberList)) levels) t
      Where market_code in ('EUP','APCAC')
      Group by user_name, in_use
      Having count(distinct market_code) = 2
    

    上面的查询显示了 AND 正如我们所使用的 count = 2 您可以使用 count = 1 以及相应的市场代码 IN 对于 OR 还有 IN 查询