如何根据一个字段是不是包含oracle sql中的逗号分隔字符串将单行拆分为多行?

Posted

技术标签:

【中文标题】如何根据一个字段是不是包含oracle sql中的逗号分隔字符串将单行拆分为多行?【英文标题】:How to split single rows into multiple rows depending on whether one field contains comma separated string in oracle sql?如何根据一个字段是否包含oracle sql中的逗号分隔字符串将单行拆分为多行? 【发布时间】:2020-06-01 15:38:42 【问题描述】:

我创建了一个函数 get_depatment_names,它在单个返回值中返回逗号分隔的值。 函数的输出是:Sales,Retail,Electronic。

另一个函数 get_location_names 以相同的方式返回位置。输出:西约克、夏尔、兰卡斯

现在,我在 select 语句中调用这两个函数以及其他列。

SELECT dept_id,
       date,
       get_department_names dept_name,
       get_location_names location
       status
FROM   department
WHERE dept_id = 1;

输出显示如下

dept_id ---date ----dept_name -------location----- status

1 ---01/01/2018 --- 销售、零售、电子 --- 西约克、夏尔、兰卡斯 -- 活跃

预期输出:

1--01/01/2018 --- 销售 --- 西约克 -- 活跃

1--01/01/2018 --- 零售 --- Shire -- 活跃

1--01/01/2018 --- 电子 ---Lancas --Active

我尝试在 select stmt 中将 regexp_sub 与 connect 一起使用,如下所示,但出现“单行子查询返回多行”错误。

SELECT dept_id,
       date,
       (select regexp_substr(get_department_names(id),'[^,]+',1,level) from dual
        connect by regexp_substr(get_department_names(id),'[^,]+',1,level) is not null)  dept_name,
       (select regexp_substr(get_location_names (id),'[^,]+',1,level) from dual
        connect by regexp_substr(get_location_names(id),'[^,]+',1,level) is not null) location
       status
FROM   department
WHERE dept_id = 1;

请告诉我如何纠正这个问题。

【问题讨论】:

【参考方案1】:

应该是这样的(第 1 - 4 行代表样本数据;您需要的查询从第 5 行开始):

SQL> with department (dept_id, datum, dept_name, location, status) as
  2    (select 1, date '2018-01-01', 'sales,retail,electronic',
  3      'West York,Shire,Lancas', 'active' from dual
  4    )
  5  select dept_id,
  6    datum,
  7    regexp_substr(dept_name, '[^,]+', 1, level) dept_name,
  8    regexp_substr(location , '[^,]+', 1, level) location,
  9    status
 10  from department
 11  where dept_id = 1
 12  connect by level <= regexp_count(dept_name, ',') + 1;

   DEPT_ID DATUM      DEPT_NAME       LOCATION        STATUS
---------- ---------- --------------- --------------- ------
         1 01/01/2018 sales           West York       active
         1 01/01/2018 retail          Shire           active
         1 01/01/2018 electronic      Lancas          active

SQL>

【讨论】:

以上是关于如何根据一个字段是不是包含oracle sql中的逗号分隔字符串将单行拆分为多行?的主要内容,如果未能解决你的问题,请参考以下文章

oracle sql 判断 字段是不是是汉字

Oracle PL/SQL:如何根据同一记录的 ID 字段返回字符串值?

急急急,Sql查询一个字段是不是存在某一个值,怎么写查询语句?

在sql语句中怎么判断一个字段是不是包含在另一个字符串中

Mysql字符串字段,如何判断是不是包含某个字符串

Mysql查找如何判断字段是不是包含某个字符串