计算Extract Value找到匹配项的行数

时间:2014-08-18 14:20:56

标签: mysql xml xpath extract-value

表中有100,000行,其中包含一个存储大型XML块的列,我需要检查是否有某个XML标记在此列中填充了数据,假设该列名为test_request,XML标记为命名为' d。另外,我想确保内部的价值' d'在XML标记中不包含换行符/ n。因此,对于每个匹配的行,我想在整体计数中加1。这是我到目前为止的查询。

SELECT EXTRACTVALUE( UNCOMPRESS(`test__request` ) ,  count('/a/b/c/d') ) 
FROM testTable16
WHERE  `test_created` >  '2014-08-16 10:00:00'
AND  `test_created` <=  '2014-08-16 10:10:00'
AND  `test_client` =  'test2'
AND  `test_user` =  'testuser2'
AND UNCOMPRESS(  `test__request` ) LIKE  '%<testID>test</testID>%'
LIMIT 0 , 30
虽然它没有工作,但它返回100,000行,我显然无法筛选。而且我不确定如何进行非换行检查。

1 个答案:

答案 0 :(得分:1)

如果您只返回带有计数的行,则应将计数移至WHERE子句。

我的XPATH有点生疏,但我相信你可以使用带有contains函数的谓词:

SELECT *
FROM testTable16
WHERE  `test_created` >  '2014-08-16 10:00:00'
AND  `test_created` <=  '2014-08-16 10:10:00'
AND  `test_client` =  'test2'
AND  `test_user` =  'testuser2'
AND UNCOMPRESS(`test__request`) LIKE  '%<testID>test</testID>%'
AND EXTRACTVALUE( 
      UNCOMPRESS(`test__request`),  
      'count(/a/b/c/d[contains(text(),"\n")])'
    ) > 0
LIMIT 0 , 30

如果要返回至少有一个匹配项的所有行的计数,请使用SELECT COUNT(*) ...

如果您想要使用所有节点计数的总数:

SELECT SUM(EXTRACTVALUE( 
         UNCOMPRESS(`test__request`),  
         'count(/a/b/c/d[contains(text(),"\n")])'
       ))
FROM testTable16
WHERE  `test_created` >  '2014-08-16 10:00:00'
AND  `test_created` <=  '2014-08-16 10:10:00'
AND  `test_client` =  'test2'
AND  `test_user` =  'testuser2'
AND UNCOMPRESS(`test__request`) LIKE '%<testID>test</testID>%'