0

大きな XML ブロックを格納する列を含むテーブルに 100,000 行があり、特定の 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行を返すため、機能しません。isnt改行チェックを行う方法がわかりません。

4

1 に答える 1

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

少なくとも 1 つの一致を使用するすべての行の数を返したい場合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>%'
于 2014-08-18T14:41:39.267 に答える