Brug xstien ()
funktion:
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()
fjerner den omgivende
Returnerer en matrix af xml
- med et enkelt element i dette tilfælde:
status
xml[]
-------
{ERROR_MISSING_DATA}
Anvendt på dit bord
Som svar på din spørgsmålsopdatering kan dette blot være:
SELECT id, xpath('./status/text()', response::xml) AS status
FROM tbl;
Hvis du er sikker på, at der kun er et enkelt statusmærke pr. række, kan du blot udtrække det første element fra arrayet:
SELECT id, (xpath('./status/text()', response::xml))[1] AS status
FROM tbl;
Hvis der kan være flere statuselementer:
SELECT id, unnest(xpath('./status/text()', response::xml)) AS status
FROM tbl;
Giver dig 1-n rækker pr. id
.
Cast til xml
Siden du definerede dine kolonner til at være af typen tekst
(i stedet for xml
, du bruger at caste til xml
eksplicit. Funktionen xpath()
forventer de 2. parametre af typen xml
. En strengkonstant uden skrift tvinges til xml
automatisk, men en tekst
kolonne er ikke. Du skal caste eksplicit.
Dette fungerer uden eksplicit cast:
SELECT xpath('./status/text()'
,'<?xml version="1.0" ?><response><status>SUCCESS</status></response>')
En CTE som i mit første eksempel behov en type for hver kolonne i "fælles tabeludtryk". Hvis jeg ikke havde castet til en bestemt type, var typen ukendt
ville have været brugt - hvilket ikke er det samme som en utypestreng . Der er naturligvis ingen direkte konvertering implementeret mellem ukendt
og xml
. Du skal caste til tekst
først:unknown_type_col::text::xml
. Bedre at caste til ::xml
med det samme.
Dette er blevet strammet med PostgreSQL 9.1 (tror jeg). Ældre versioner var mere eftergivende.
Uanset hvad, med enhver af disse metoder skal strengen være gyldig xml eller rollebesætningen (implicit eller eksplicit) vil rejse en undtagelse.