加入Oracle中的拆分字符串列

时间:2015-05-12 13:42:18

标签: sql oracle join plsql

我的数据库中有一个列,其中包含4个字段作为" \"分隔字符串。

在我的报告中,我将这些字段分开,因为我需要它们。

我还需要单独使用这些字段作为针对另一个表的条件。

我尝试过的事情 临时表:

CREATE GLOBAL TEMPORARY TABLE pfcc
   ON COMMIT PRESERVE ROWS 
   AS select REGEXP_SUBSTR(s, '[^\]+', 1, 1) colA,
       REGEXP_SUBSTR(s, '[^\]+', 1, 2) colB,
       REGEXP_SUBSTR(s, '[^\]+', 1, 3) colC,
       REGEXP_SUBSTR(s, '[^\]+', 1, 4) colD
from (select delimited s from products
                        where productid = 1)

然后将其加入另一张桌子。

select * from pfcc tmp
inner join lineitems gch 
    on gch.Line = tmp.colA
    AND gch.productB = tmp.colB
    AND gch.productC = tmp.colC

我还试图在不将值存储在表中的情况下立即加入:

select REGEXP_SUBSTR(s, '[^\]+', 1, 1) colA,
       REGEXP_SUBSTR(s, '[^\]+', 1, 2) colB,
       REGEXP_SUBSTR(s, '[^\]+', 1, 3) colC,
       REGEXP_SUBSTR(s, '[^\]+', 1, 4) colD
from (select delimited s from products
                        where productid = 1) tmp
inner join lineitems gch 
    on gch.Line = tmp.colA
    AND gch.productB = tmp.colB
    AND gch.productC = tmp.colC

我想使用临时表避免,并使其与第二种方式类似。如果这是不可避免的,那就这样吧。

有人有解决方案吗?

谢谢, JFIT

3 个答案:

答案 0 :(得分:2)

您可以按如下方式使用CTE。

with pfcc as 
(select REGEXP_SUBSTR(delimited , '[^\]+', 1, 1) colA,
       REGEXP_SUBSTR(delimited , '[^\]+', 1, 2) colB,
       REGEXP_SUBSTR(delimited , '[^\]+', 1, 3) colC,
       REGEXP_SUBSTR(delimited , '[^\]+', 1, 4) colD
  from products
 where productid = 1)
select * from pfcc tmp
inner join lineitems gch 
    on gch.Line = tmp.colA
    AND gch.productB = tmp.colB
    AND gch.productC = tmp.colC;

答案 1 :(得分:1)

我认为这是您想要的查询:

select gch.Line, gch.productB, gch.productC,
       REGEXP_SUBSTR(p.delimited, '[^\]+', 1, 4)
from  products p inner join
      lineitems gch 
      on gch.Line = REGEXP_SUBSTR(p.delimited, '[^\]+', 1, 1) and
         gch.productB = REGEXP_SUBSTR(p.delimited, '[^\]+', 1, 2) and
         gch.productC = REGEXP_SUBSTR(p.delimited, '[^\]+', 1, 3)
where p.productid = 1;

既不需要子查询也不需要临时表。

答案 2 :(得分:1)

警告!如果列表中有空项并且您正在选择该null项之后的元素,则正则表达式'[^\]+'将返回意外结果。请参阅此示例,其中选择了第3个项目,但是' 4'退回。 ' 4'实际上是分隔列表中的第4项,而不是第三项。事实上,它是第3项,但它有一个价值。

SQL> select REGEXP_SUBSTR('1\\3\4', '[^\]+', 1, 3) colA from dual;

C
-
4

SQL>

使用此选项,选择列表中的实际第3项:

SQL> select REGEXP_SUBSTR('1\\3\4', '([^\]*)(\\|$)', 1, 3, NULL, 1) colA from dual;

C
-
3

有关更详细的示例和说明,请参阅此帖子: REGEX to select nth value from a list, allowing for nulls