【问题标题】:Join to splitted string columns in Oracle在 Oracle 中加入拆分的字符串列
【发布时间】:2015-07-23 10:25:17
【问题描述】:

我的数据库中有一个列,其中包含 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

【问题讨论】:

  • 使用With 子句,或者干脆创建一个视图。
  • 仅供参考 - WITH 指的是使用 Common Table Expressions
  • 你为什么不把 pfcc 作为一个子查询,然后用它来加入你的另一个表?

标签: sql oracle join plsql


【解决方案1】:

您可以按如下方式使用 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;

【讨论】:

  • 非常感谢您的回复 - 我最终使用了另一个答案,因为它非常适合我的大量 where 子句,而无需使用临时表。谢谢。
【解决方案2】:

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

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;

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

【讨论】:

  • 正是我需要的。谢谢一百万。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-19
    • 2021-01-08
    • 1970-01-01
    • 2023-01-03
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多