伙计们,我正在尝试从下一个查询中获取值
SELECT X.val, X.tdate
FROM
XMLTABLE ('$d/IRR' passing XMLPARSE(DOCUMENT '<IRR><value>2</value><tdate>2014-06-05</tdate><value>4</value><tdate>2014-08-05</tdate></IRR>') as "d"
COLUMNS
val DOUBLE PATH './value',
tdate DATE PATH './tdate' ) AS X;
但我总是得到错误:
当数据类型“(item(),item()+)”的表达式时,不能使用 数据类型“DATE”预计在上下文中
同时,如果只有一个值和日期
,一切正常SELECT X.val, X.tdate
FROM
XMLTABLE ('$d/IRR' passing XMLPARSE(DOCUMENT '<IRR><value>2</value><tdate>2014-06-05</tdate></IRR>') as "d"
COLUMNS
val DOUBLE PATH './value',
tdate DATE PATH './tdate' ) AS X;
正如我在此理解的那样,因为XMLTABLE只等待1个值,如果它们很少,它就无法解析文档 如果只需要像这样返回1列,即使有一些值,它还可以正常工作:
SELECT X.tdate
FROM
XMLTABLE ('$d/IRR/tdate' passing XMLPARSE(DOCUMENT '<IRR><value>2</value><tdate>2014-06-05</tdate><value>4</value><tdate>2014-08-05</tdate></IRR>') as "d"
COLUMNS
tdate DATE PATH '.' ) AS X;
所以这个查询返回两个日期。
tdate
2014-06-05
2014-08-05
那么有没有办法在同一个查询中返回具有乘法值的两列? e.g。
val tdate
2 2014-06-05
4 2014-08-05
注意:这是我的程序中传递的xml文档的表示(它可能包含2个以上的值)
<IRR><value>2</value><tdate>2014-06-05</tdate><value>4</value><tdate>2014-08-05</tdate></IRR>
答案 0 :(得分:0)
XMLTABLE()
可以返回一个特殊的常规列,其中包含每行的序号。您可以使用它来执行以下操作:
WITH t(x) AS (VALUES XMLPARSE(DOCUMENT '<IRR><value>2</value><tdate>2014-06-05</tdate><value>4</value><tdate>2014-08-05</tdate></IRR>'))
SELECT x1.value, x2.tdate
FROM
t,
XMLTABLE ('$X//value'
COLUMNS
value INT PATH '.',
idx FOR ORDINALITY) AS X1,
XMLTABLE ('$X//tdate'
COLUMNS
tdate DATE PATH '.',
idx FOR ORDINALITY) AS X2
WHERE x1.idx = x2.idx
ORDER BY 2
这假设XML解析器保留了元素顺序,虽然没有明确记录,但似乎是我使用过的所有解析器的情况。
理想情况下,您应该重新考虑XML架构,例如,将tdate
作为value
的属性传递(反之亦然)。