【问题标题】:converting a column result in to multiple row in oracle [duplicate]在oracle中将列结果转换为多行[重复]
【发布时间】:2019-09-13 09:27:18
【问题描述】:

我在 oracle db 中有 material_info

MATERIAL    COUNTRIES
----------------------------
HX345TY     US,IN,SG,CN,JP
MXT15WO     SL,AU,IN,US,AF
UIY7890#RT  UK,US,IN,SG,PK

我想要如下输出

MATERIAL    COUNTRIES
-----------------------------
HX345TY     US
HX345TY     IN
HX345TY     SG
HX345TY     CN
HX345TY     JP
MXT15WO     SL
MXT15WO     AU
MXT15WO     IN
MXT15WO     US
MXT15WO     AF
UIY7890#RT  UK
UIY7890#RT  US
UIY7890#RT  IN
UIY7890#RT  SG
UIY7890#RT  PK

我为此编写了如下查询。但它不工作。谁能给出解决方案

select material, trim(regexp_substr(COUNTRIES,'[^,]+', 1, level) ) COUNTRIES, level
from material_info connect by regexp_substr(COUNTRIES, '[^,]+', 1, level) is not null;

【问题讨论】:

  • 您不应该将逗号分隔的值存储在单个列中

标签: sql oracle split delimiter


【解决方案1】:

您可以通过使用distinctregexp_count 进行轻微更改以使其动态

select distinct material,
       regexp_substr(countries, '[^,]+', 1, level) countries
  from material_info
connect by level <= regexp_count(countries, '[^,]+')
order by material;

或使用group by material, countries, level作为

select material,
       regexp_substr(countries, '[^,]+', 1, level) countries
  from material_info
connect by level <= regexp_count(countries, '[^,]+')
group by material, countries, level;

甚至不用trim

Demo

【讨论】:

    【解决方案2】:

    您应该更喜欢prior + sys_guid 技术。对于大量记录,它比 distinct 高效得多。

    select material,
           regexp_substr(countries, '[^,]+', 1, level) countries
      from material_info
    connect by level <= regexp_count(countries, '[^,]+')
    and prior material = material
    and prior sys_guid() is not null;
    

    DEMO

    【讨论】:

    猜你喜欢
    • 2014-01-27
    • 1970-01-01
    • 2019-10-14
    • 2020-02-23
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    相关资源
    最近更新 更多