sql >> Database teknologi >  >> RDS >> PostgreSQL

Udpakning af værdi af xml-tag i PostgreSQL

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 tag.
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.




  1. Sådan indstilles lokaliteten for den aktuelle forbindelse i MySQL

  2. PHP MySQL INSERT mislykkes på grund af unik begrænsning

  3. Sådan laver du CREATE INDEX korrekt med SQLite

  4. Hvordan påvirker storage-backend Datomic?