PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Extraction de la valeur de la balise xml dans PostgreSQL

Utilisez le xpath() fonction :

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() supprime le <status> environnant tag.
Retourne un tableau de xml - avec un seul élément dans ce cas :

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

Appliqué à votre tableau

En réponse à la mise à jour de votre question, cela peut simplement être :

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

Si vous êtes certain qu'il n'y a qu'une seule balise de statut par ligne, vous pouvez simplement extraire le premier élément du tableau :

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

S'il peut y avoir plusieurs éléments d'état :

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

Vous obtient 1-n lignes par id .

Diffuser en xml

Puisque vous avez défini vos colonnes comme étant de type text (au lieu de xml , vous avez besoin convertir en xml explicitement. La fonction xpath() attend le 2ème paramètre de type xml . Une constante de chaîne non typée est convertie en xml automatiquement, mais un text colonne n'est pas. Vous devez caster explicitement.

Cela fonctionne sans distribution explicite :

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

Un CTE comme dans mon premier exemple besoins un type pour chaque colonne dans "l'expression de table commune". Si je n'avais pas converti en un type spécifique, le type unknown aurait été utilisé - ce qui n'est pas la même chose qu'une chaîne non typée . Évidemment, il n'y a pas de conversion directe implémentée entre unknown et xml . Vous devriez caster en text d'abord :unknown_type_col::text::xml . Mieux vaut caster en ::xml tout de suite.

Cela a été resserré avec PostgreSQL 9.1 (je pense). Les anciennes versions étaient plus permissives.

Dans tous les cas, avec l'une de ces méthodes, la chaîne doit être xml valide ou le transtypage (implicite ou explicite) lèvera une exception.