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