oracle SQL拆分单个单元格查询结果以用作另一个查询中的列表,糟糕的数据库设计解决方案

rekjcdws  于 2023-02-03  发布在  Oracle
关注(0)|答案(2)|浏览(103)

所以我的问题的主要症结是这个数据库的原始设计者决定将结果组合到单个表格单元格中。我没有更改数据库架构的权限。我最终将不得不接受这个查询并稍微更改它以通过ColdFusion工作,但任何让我走上正轨的事情都将非常有帮助。

我需要一种方法来获取这些值,在逗号处拆分它们,并将它们转换为一个列表,以便用于另一个查询。
比如:

Select full_cert_name FROM tbl_fullofcerts
WHERE certid IN --(This is where I need help)
7uhlpewt

7uhlpewt1#

以下(子查询)是拆分它的一种方法:

select full_cert_name
from tbl_fullofcerts
where certid in (select regexp_substr(pre_purposetypeid, '[^,]+', 1, column_value)
                 from that_table cross join
                   table(cast(multiset(select level from dual
                                       connect by level <= regexp_count(pre_purposetypeid, ',') + 1
                                      ) as sys.odcinumberlist))
                );

它是做什么的?例如:

SQL> select * from that_Table;

        ID PRE_P PRE_PURP
---------- ----- --------
         1 8,9   28,35,42
         2 4,5,6 1,2

SQL> select id,
  2         pre_purposetypeid,
  3         regexp_substr(pre_purposetypeid, '[^,]+', 1, column_value)
  4  from that_table cross join
  5    table(cast(multiset(select level from dual
  6                        connect by level <= regexp_count(pre_purposetypeid, ',') + 1
  7                       ) as sys.odcinumberlist))
  8  ;

        ID PRE_P REGEXP_SUBSTR(PRE_PU
---------- ----- --------------------
         1 8,9   8
         1 8,9   9
         2 4,5,6 4
         2 4,5,6 5
         2 4,5,6 6

SQL>

最终的代码取决于你真正想做什么(我不太明白你的问题,因为“这是我需要帮助的地方”是不是很描述性),但-这是一般的想法。

suzh9iv8

suzh9iv82#

不要拆分字符串(这是一个开销很大的操作,没有必要);而是查找匹配的子字符串(包括前导和尾随分隔符,以便匹配整个术语):

SELECT full_cert_name
FROM   tbl_fullofcerts c
WHERE  EXISTS(
  SELECT 1
  FROM   table_name t
  WHERE  ';' || t.pre_purposetypeid || ';' LIKE  '%;' || c.certid || ';%'
);

SELECT c.certid,
       c.full_cert_name,
       t.pre_purposetypeid
FROM   tbl_fullofcerts c
       INNER JOIN table_name t
       ON ';' || t.pre_purposetypeid || ';' LIKE  '%;' || c.certid || ';%';

相关问题