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.