表中有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行,我显然无法筛选。而且我不确定如何进行非换行检查。
答案 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>%'