1

XML値をPostgreSQL9.Xと比較する必要があります。例:

 SELECT 1 FROM t WHERE xml1=xml2; -- error for XML datatype

ただし、テキストデータ型へのキャストでのみ実行できます。

 SELECT 1 FROM t WHERE xml1::text=xml2::text; -- OK, but is a text-comparison

これを行うには、これが最善の方法ではありません。より良い比較アルゴリズムが必要です...それを探すと、おそらく「CanonicalXML」を比較できることがわかります。

PostgreSQLで「CanonicalXML比較」を行う方法は?


:PostgreSQLチームは、XML比較について誤った前提を想定していますか?

XML比較に関する多くのドキュメントでは、 CanonicalXMLがその操作の参照形式であるとされています。元。ウィキペディアで彼らは言う、

W3Cによると、2つのXMLドキュメントが同じ標準形である場合、2つのドキュメントは特定のアプリケーションコンテキスト内で論理的に同等です。

しかし、PostgreSQL docs / 9.2によると、

xmlデータ型は、比較演算子を提供しないという点で珍しいものです。これは、XMLデータに対して明確に定義された普遍的に有用な比較アルゴリズムがないためです。

ええと、私にとってそれは誤った前提であり、PostgreSQLの重要な問題の本当の欠如を隠すことができます。

4

1 に答える 1

4

私はPostgreSQLでのXMLタイプの実装に貢献し、おそらくあなたが引用しているドキュメントのほとんどを書きました。

これが現在のようになっている理由はいくつかあります。

  • SQL標準では、型の比較演算子は指定されていませんxml
  • 実装が開始された時点では、Canonical XMLは広く使用され、理解されていませんでした(少なくとも関係者は間違いなく)。
  • XMLの正規化が機能しない特定の制限があります。これらは実際にはめったに見られないかもしれませんが、これにより、データ型の一部の値を比較できない状況が発生し、たとえば、インデックス作成に問題が発生します。(浮動小数点型のNaN値には、同様の理由で順序付け位置が割り当てられます。)
  • 正規化による比較がすべての用途に適切であり、ユーザーが常に望んでいるものであるかどうかはまだ議論の余地があります。

オプションで使用するためのXML正規化関数の実装は確かに歓迎されます。実際には別のxmlcanonicalタイプを見たいのですが、それはかなり手間がかかります。

于 2013-03-17T21:54:47.027 に答える