PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Mengekstrak nilai tag xml di PostgreSQL

Gunakan xpath() fungsi:

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() menghapus <status> surrounding di sekitarnya tag.
Mengembalikan larik xml - dengan satu elemen dalam hal ini:

status
xml[]
-------
{ERROR_MISSING_DATA}

Diterapkan ke meja Anda

Menanggapi pembaruan pertanyaan Anda, ini dapat berupa:

SELECT id, xpath('./status/text()', response::xml) AS status
FROM   tbl;

Jika Anda yakin hanya ada satu tag status per baris, Anda cukup mengekstrak item pertama dari larik:

SELECT id, (xpath('./status/text()', response::xml))[1] AS status
FROM   tbl;

Jika ada beberapa item status:

SELECT id, unnest(xpath('./status/text()', response::xml)) AS status
FROM   tbl;

Memberi Anda 1-n baris per id .

Transmisikan ke xml

Karena Anda mendefinisikan kolom Anda bertipe text (bukan xml , Anda membutuhkan untuk mentransmisikan ke xml secara eksplisit. Fungsi xpath() mengharapkan parameter ke-2 dari tipe xml . Konstanta string yang tidak diketik dipaksa ke xml secara otomatis, tetapi text kolom tidak. Anda perlu mentransmisi secara eksplisit.

Ini berfungsi tanpa pemeran eksplisit:

  SELECT xpath('./status/text()'
      ,'<?xml version="1.0" ?><response><status>SUCCESS</status></response>')

CTE seperti pada contoh pertama saya kebutuhan tipe untuk setiap kolom dalam "ekspresi tabel umum". Jika saya tidak menggunakan tipe tertentu, tipe unknown akan digunakan - yang tidak hal yang sama dengan string yang tidak diketik . Jelas, tidak ada konversi langsung yang diterapkan antara unknown dan xml . Anda harus mentransmisikan ke text pertama:unknown_type_col::text::xml . Lebih baik ditransmisikan ke ::xml segera.

Ini telah diperketat dengan PostgreSQL 9.1 (saya pikir). Versi lama lebih permisif.

Either way, dengan salah satu metode ini string harus xml valid atau pemerannya (implisit atau eksplisit) akan memunculkan pengecualian.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL:.psql_history ke /dev/null

  2. Kueri UNION ALL dinamis di Postgres

  3. Bagaimana cara mendapatkan waktu nyata dalam transaksi PostgreSQL?

  4. ImportError saat menjalankan cgi-bin di localhost - simbol tidak terdefinisi:lo_truncate64

  5. Bagaimana cara menulis batasan mengenai jumlah baris maksimum di postgresql?