1

viewsXMLドキュメントを含む列を持つテーブルがあります(として保存されますtext)。簡略版は次のとおりです。

<?xml version="1.0"?>
<view>
  <image>
    <sequence>
      <param name="scan">129</param>
    </sequence>
  </image>
  <image>
    <sequence>
      <param name="scan">1</param>
    </sequence>
  </image>
  [...]
</view>

別のテーブルには、XML で参照されているスキャンが含まれています。現時点で新しいテーブルへのリファクタリングが現実的でない場合、SQL クエリで 2 つのテーブルをどのように接続すればよいですか?

4

1 に答える 1

3

PostgreSQL が でコンパイルされている場合--with-libxml、次のクエリが機能するはずです。

SELECT ...
  FROM views
  JOIN scans ON scans.id = ANY (
           xpath(
               '/view/image/sequence/param[@name = "scan"]/text()',
                views.xml::xml)::text[]::int[])
;

あれは:

  1. views.xmlからtextにキャストしxmlます。
  2. xmlを使用して、すべてのスキャン ID 値を配列として取得しますxpath()
  3. xml配列を配列にキャストし、text次に配列にintキャストします (少なくとも PostgreSQL 9.2 では、直接キャストxml[]することはできません)。int[]
  4. XML からのスキャン ID の少なくとも 1 つが一致することを確認してください。
于 2013-01-15T09:21:04.200 に答える