【发布时间】:2020-01-30 03:46:40
【问题描述】:
我正在从 XML 类型的字段中提取一些数据,从特定标签中获取一些值,并且我设法以这样的结果形式收集它们:
echo | type| color | active
-------------------------------------------
echo1 | car | yellow,green,blue | no,no,no
echo1 | car | yellow,green | yes,yes
echo2 | car | green,blue,red | no,no,no
echo2 | car | blue,red | yes,yes
echo3 | car | yellow,green | no,yes
...
现在我需要将这些结果转换为:
echo | type| color | active
------------------------------
echo1 | car | yellow | no
echo1 | car | green | no
echo1 | car | blue | no
echo1 | car | yellow | yes
echo1 | car | green | yes
echo2 | car | green | no
echo2 | car | blue | no
echo2 | car | red | no
echo2 | car | blue | yes
echo2 | car | red | yes
echo3 | car | yellow | no
echo3 | car | green | yes
...
意思是,我需要同时拆分第 3 列和第 4 列的值。 color 列中的每个值在活动列中都有一个对应的值,我需要匹配记录中的这些对。
所以有这样的结果我用这个:
SELECT echo, type, trim(x.COLUMN_VALUE) color, trim(y.COLUMN_VALUE) active
FROM
( RESULTS )
, xmltable(('"' || REPLACE(color, ',', '","') || '"')) x, xmltable(('"' || REPLACE(active, ',', '","') || '"')) y
ORDER BY echo, type, color, active
如果我一次只转换这两列中的一列,它可以正常工作,但是当我想一次转换 2 时,它会将记录相乘,就像将 y 列的值乘以 x 列的值一样。
如果在最后一列中只有“yes”或只有“no”值,那么在选择中使用 distinct 会起作用,它会消除过时(不是真的)记录。但在混合价值观的情况下,我正在努力做到这一点。
谁能给我一个提示如何修复它以不让过时的记录?
提前致谢!
示例 XML:
<rowCollection>
<row>
<column name="active">YES</column>
<column name="customertype">Default</column>
<column name="type">Default</column>
<column name="risklevel">Default</column>
<column name="color">yellow</column>
</row>
<row>
<column name="active">YES</column>
<column name="customertype">Default</column>
<column name="type">Default</column>
<column name="risklevel">Default</column>
<column name="color">green</column>
</row>
</rowCollection>
用于生成结果的查询片段:
xmlcast(
xmlquery(
'string-join(/rowCollection/row/column[5]/text(),",")'
passing xml_field
RETURNING CONTENT
) AS VARCHAR2(500)
) color,
xmlcast(
xmlquery(
'string-join(/rowCollection/row/column[1]/text(),",")'
passing xml_field
RETURNING CONTENT
) AS VARCHAR2(300)
) active
【问题讨论】: