将列结果转换为oracle中的多行
converting a column result in to multiple row in oracle
我在 oracle 数据库中有 material_info
table
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;
您可以使用 distinct
和 regexp_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
您应该更喜欢 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;
我在 oracle 数据库中有 material_info
table
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;
您可以使用 distinct
和 regexp_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
您应该更喜欢 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;