PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Pobieranie wartości tagu xml w PostgreSQL

Użyj xpath() funkcja:

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() usuwa otaczający <status> tag.
Zwraca tablicę xml - z jednym elementem w tym przypadku:

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

Zastosowano do Twojego stołu

W odpowiedzi na aktualizację Twojego pytania może to być po prostu:

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

Jeśli masz pewność, że w każdym wierszu jest tylko jeden znacznik stanu, możesz po prostu wyodrębnić pierwszy element z tablicy:

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

Jeśli może być wiele pozycji statusu:

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

Dostaje 1n wierszy na id .

Przesyłaj do xml

Ponieważ zdefiniowałeś kolumny jako typu text (zamiast xml , potrzebujesz przesyłać do xml wyraźnie. Funkcja xpath() oczekuje drugich parametrów typu xml . Niewpisana stała łańcuchowa jest przypisywana do xml automatycznie, ale text kolumna nie jest. Musisz jawnie przesyłać.

Działa to bez wyraźnego rzutowania:

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

CTE jak w moim pierwszym przykładzie potrzeby typ dla każdej kolumny w "wspólnym wyrażeniu tabelowym". Gdybym nie rzutował na konkretny typ, typ unknown zostałby użyty - co nie to samo, co nieopisany ciąg . Oczywiście nie ma bezpośredniej konwersji między unknown i xml . Musiałbyś przesyłać do text po pierwsze:unknown_type_col::text::xml . Lepiej rzutować do ::xml od razu.

Zostało to zaostrzone w PostgreSQL 9.1 (chyba). Starsze wersje były bardziej liberalne.

Tak czy inaczej, przy każdej z tych metod ciąg musi być poprawny xml lub rzutowanie (niejawne lub jawne) zgłosi wyjątek.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie K-najbliższego sąsiada w PostGIS

  2. Poddźwiękowy szablon postgreSQL

  3. BŁĄD PostgreSQL:42P01:relacja [Tabela] nie istnieje

  4. Npgsql/ Postgresql:funkcja nie istnieje komunikat o błędzie, gdy tak się dzieje

  5. Komunikat 28000:brak wpisu pg_hba.conf dla hosta \xx.xxx.xxx.xxxx\, użytkownik \User, baza danych \databasename\, SSL wyłączony