一个小的背景故事,我在数据库中有一个逗号分隔的列,我试图将其转换为多对多的联结表,所以没有
ID REPORT
1 5,6,7
我会看到
ID REPORT
1 5
1 6
1 7
下面的查询就是这样,似乎工作正常,
with t as (select id,hqcat from report)
SELECT id, EXTRACT(column_value,'/e/text()') hqcat from t x,
TABLE(XMLSEQUENCE(EXTRACT(XMLTYPE('<ROW><e>'||REPLACE(hqcat,',','</e><e>')||'</e></ROW>'),'//e')))
然而,当我尝试通过hqcat将它加入我的查找表时,我得到关于不稳定数据类型的ORA-00932错误,请帮助我,如何更改我的原始查询以使其与其他表和连接一起使用?
这是导致错误的连接:
select *
from BIN03 a11
join ( with t as (select id,hqcat from report)
SELECT id, EXTRACT(column_value,'/e/text()') hqcat from t x,
TABLE(XMLSEQUENCE(EXTRACT(XMLTYPE('<ROW><e>'||REPLACE(hqcat,',','</e><e>')||'</e></ROW>'),'//e')))) a12
on (a11.CODE = a12.HQCAT);
谢谢!
我也试图创造我的新人和许多人。如此查看:
WITH TAB AS
( (select id ID, hqcat STR from report))
SELECT ID as ID,
REGEXP_SUBSTR (STR, '[^,]+', 1, LEVEL) HQCAT FROM TAB
CONNECT BY LEVEL <= (regexp_count(str,',') + 1);
但这只会将查询速度降低1000以上......
答案 0 :(得分:0)
(deprecated) extract function返回XMLType,而不是varchar2
。您可以在内联视图中将其强制转换为所需类型:
cast(EXTRACT(column_value,'/e/text()') as varchar2(3))
或比较值:
a11.CODE = cast(a12.HQCAT as varchar2(3))
我已经猜到了你需要的可变尺寸,显然,你可能需要它与众不同。您也可以使用the XMLType getStringVal()
function,如下所示。
在内联视图的子句中将旧式交叉连接与逗号混合似乎有点奇怪,其余部分使用ANSI连接,您可能会得到奇怪的(或者很难调试,无论如何)结果这样做。为清晰起见,您还可以使用另一个CTE:
with t as (select id, hqcat from report),
a12 as (
select id, extract(column_value,'/e/text()').getstringval() hqcat
from t
cross join table(xmlsequence(extract(xmltype('<ROW><e>'||
replace(hqcat,',','</e><e>')||'</e></ROW>'),'//e')))
)
select *
from a12
join bin03 a11 on a11.code = a12.hqcat;