无法使用XMLTABLE让孩子乘以值

时间:2015-12-28 10:30:55

标签: xml-parsing db2 multiple-columns xmltable

伙计们,我正在尝试从下一个查询中获取值

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>

1 个答案:

答案 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的属性传递(反之亦然)。