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.