如何根据oracle plsql中列中的逗号分隔值拆分选择查询行

Posted

技术标签:

【中文标题】如何根据oracle plsql中列中的逗号分隔值拆分选择查询行【英文标题】:How to split select query rows based on the comma separated values in the columns in oracle plsql 【发布时间】:2020-06-01 17:58:12 【问题描述】:

我写了2个查询Union。我得到的结果以逗号分隔在两列中。输出显示为 2 条记录。

如何将它们拆分为 4 条记录,如下预期结果?

select emp_id,dept_name,location from department where dept_id = 1
union
select emp_id,dept_name,location from sales_dept where dept_id = 1;

输出

emp_id ----- dept_name------  location

r1-----------Retail,IT-----   US, UK
k2-----------Sales,Chemical-  NZ, SA
j3-----------Biotech(Chemistry,Tech)-   JA

我需要如下的预期输出

emp_id ----- dept_name-----location
r1-----------Retail--------US
r1-----------IT----------- UK
k2-----------Sales---------NZ
k2-----------Chemical------SA
j3---------Biotech(Chemistry,Tech)--JA

dept_name 为“Biotech(Chemistry,Tech)”的最后一条记录应显示为单个记录,不得拆分。请告诉我该怎么做。

Jim 给出的查询工作正常,除非在这种情况下,dept_name 是 Biotech(Chemistry,Tech),因为现在给出了要求。

【问题讨论】:

【参考方案1】:

请使用以下查询,

select emp_id, dept_name, location from
(select distinct emp_id, trim(regexp_substr(dept_name,'[^,]+', 1, level) ) dept_name, 
trim(regexp_substr(location,'[^,]+', 1, level) ) location, level
from pivot_comma
connect by regexp_substr(dept_name, '[^,]+', 1, level) is not null 
order by emp_id, level);

【讨论】:

Jim 查询工作正常。但是,只要 dept_name 为“Biotech(Chemistry,Tech)”,对于相同的输出。该记录应显示为单个记录而不是拆分。请让我知道该怎么做,因为这是新的要求,需要尽快做出改变。

以上是关于如何根据oracle plsql中列中的逗号分隔值拆分选择查询行的主要内容,如果未能解决你的问题,请参考以下文章

如何根据列中的逗号分隔值进行选择

如何根据两个逗号分隔值的列中的任何一个值获取记录

oracle中PLSQL存储过程中如何使用逗号分隔的集合(逗号分隔字符串转换为一个集合)

如何遍历 Oracle PLSQL 中的分隔列表

Oracle SQL:为列中的每个值创建一个新行,其中更多值用逗号分隔

TSQL 将列中的逗号分隔值与逗号分隔参数进行比较