xpath()
機能:
WITH x(col) AS (SELECT '<?xml version="1.0" ?><response><status>ERROR_MISSING_DATA</status></response>'::xml)
SELECT xpath('./status/text()', col) AS status
FROM x
/text()
周囲の<status>
を削除します tag。xml
の配列を返します -この場合、単一の要素を使用します:
status
xml[]
-------
{ERROR_MISSING_DATA}
テーブルに適用
質問の更新に応じて、これは単純に次のようになります。
SELECT id, xpath('./status/text()', response::xml) AS status
FROM tbl;
行ごとにステータスタグが1つしかないことが確実な場合は、配列から最初の項目を抽出するだけです。
SELECT id, (xpath('./status/text()', response::xml))[1] AS status
FROM tbl;
複数のステータス項目が存在する可能性がある場合:
SELECT id, unnest(xpath('./status/text()', response::xml)) AS status
FROM tbl;
id
ごとに1-n行を取得します 。
xml
にキャスト
列をtext
タイプに定義したので ( xml
の代わりに
、必要 xml
にキャストする 明示的に。関数xpath()
タイプxml
の2番目のパラメータが必要です 。型指定されていない文字列定数はxml
に強制変換されます 自動的に、ただしtext
列 ではありません。明示的にキャストする必要があります。
これは明示的なキャストなしで機能します:
SELECT xpath('./status/text()'
,'<?xml version="1.0" ?><response><status>SUCCESS</status></response>')
CTE 私の最初の例のように必要 「共通テーブル式」のすべての列の型。特定のタイプにキャストしていなかった場合、タイプはunknown
使用されたはずです-これはではありません 型なし文字列と同じもの 。明らかに、unknown
間で直接変換は実装されていません およびxml
。 text
にキャストする必要があります 最初:unknown_type_col::text::xml
。 ::xml
にキャストすることをお勧めします すぐに。
これはPostgreSQL9.1で強化されています(私は思います)。古いバージョンの方が寛容でした。
いずれにせよ、これらのメソッドのいずれかを使用する場合、文字列は有効なxmlである必要があります。 または、キャスト(暗黙的または明示的)によって例外が発生します。