sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLでxmlタグの値を抽出しています

    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間で直接変換は実装されていません およびxmltextにキャストする必要があります 最初:unknown_type_col::text::xml::xmlにキャストすることをお勧めします すぐに。

    これはPostgreSQL9.1で強化されています(私は思います)。古いバージョンの方が寛容でした。

    いずれにせよ、これらのメソッドのいずれかを使用する場合、文字列は有効なxmlである必要があります。 または、キャスト(暗黙的または明示的)によって例外が発生します。




    1. MySQLは整数列から先行ゼロを取り除きます

    2. 複雑なMySQLクエリの記述

    3. ResultSet.nextは、クエリにFIRST_ROWSまたはROWNUM制限が含まれている場合にのみ非常に遅くなります

    4. 致命的なエラー:183行目の...\model.phpで最大実行時間が30秒を超えました