【问题标题】:PL/SQL Search cell data separated by comma with IN conditionPL/SQL 搜索以逗号分隔的单元格数据和 IN 条件
【发布时间】:2020-12-30 19:48:24
【问题描述】:

我想搜索带有逗号分隔数据且条件为 in 的单元格。 例如,如果列值为'AAA, CCC, BBB 和 WHERE IN('AAA','BBB') 条件,我想搜索对应的行。 有没有一种有用的方法可以在 Oracle 中获得以下结果?

// 1. table data
column1    | column2
data1      | AAA,CCC,BBB
data2      | AAA,CCC
data3      | BBB,DDD,EEE
data4      | EEE,FFF,GGG

// 2. wanted result(WHERE COLUMN2 IN ('AAA', 'BBB'))
column1    | column2
data1      | AAA,CCC,BBB
data2      | AAA,CCC
data3      | BBB,DDD,EEE

【问题讨论】:

  • 这是常见的操作吗?如果您有一个设计不佳的数据模型,它存储逗号分隔的列表而不是子表甚至嵌套表,您无法修复数据模型,这是您需要做一些有规律的事情,基于简单的解决方案在likeregexp_substr 上会非常慢,因为它们不能在您正在搜索的列上使用索引。有一些方法可以解决性能问题,但这通常会使 SQL 变得相当复杂。

标签: sql oracle comma


【解决方案1】:

您还可以将 regexp_substr 与存在运算符一起使用:

 select yt.*
   from your_table yt
  where exists (select regexp_substr(yt.column2, '[^,]+', 1, level)
                  from dual 
                 where regexp_substr(yt.column2, '[^,]+', 1, level) in ('AAA', 'BBB')
            connect by regexp_substr(yt.column2, '[^,]+', 1, level) is not null)

【讨论】:

    【解决方案2】:

    不用IN,你可以使用:

    SELECT *
    FROM   table_name
    WHERE  ','||column2||',' LIKE '%,AAA,%'
    OR     ','||column2||',' LIKE '%,BBB,%'
    

    或者,一个表集合表达式:

    SELECT *
    FROM   table_name t
    WHERE  EXISTS (
             SELECT 1
             FROM   TABLE(SYS.ODCIVARCHAR2LIST('AAA','BBB'))
             WHERE  ','||t.column2||',' LIKE '%,'||COLUMN_VALUE||',%'
           );
    

    其中,对于样本数据:

    CREATE TABLE table_name ( column1, column2 ) AS
    SELECT 'data1', 'AAA,CCC,BBB' FROM DUAL UNION ALL
    SELECT 'data2', 'AAA,CCC'     FROM DUAL UNION ALL
    SELECT 'data3', 'BBB,DDD,EEE' FROM DUAL UNION ALL
    SELECT 'data4', 'EEE,FFF,GGG' FROM DUAL;
    

    两个输出:

    第 1 列 |第 2 列 :-------- | :---------- 数据1 | AAA,CCC,BBB 数据2 | AAA,CCC 数据3 | BBB,DDD,EEE

    db小提琴here

    【讨论】:

      【解决方案3】:

      您可以将 cte 用作搜索子查询并使用like,如下所示:

      With search_params as
      (Select 'AAA' as p from dual union all
      Select 'BBB' as p from dual)
       --
      Select distinct t.* 
        From your_table t 
        Join search_params s on ',' || t.column2 || ',' like '%,' || s.p || ',%'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-29
        • 2022-08-20
        • 2011-10-25
        • 1970-01-01
        • 1970-01-01
        • 2011-03-18
        • 1970-01-01
        • 2015-12-25
        相关资源
        最近更新 更多