sql >> Base de Datos >  >> RDS >> PostgreSQL

Extracción del valor de la etiqueta xml en PostgreSQL

Use el xpath() función:

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() quita el <status> circundante etiqueta.
Devuelve una matriz de xml - con un solo elemento en este caso:

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

Aplicado a tu mesa

En respuesta a la actualización de su pregunta, esto puede ser simplemente:

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

Si está seguro de que solo hay una etiqueta de estado por fila, simplemente puede extraer el primer elemento de la matriz:

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

Si puede haber varios elementos de estado:

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

Obtiene de 1 a n filas por id .

Transmitir a xml

Dado que definió sus columnas para que sean del tipo text (en lugar de xml , usted necesita para convertir a xml explícitamente. La función xpath() espera los segundos parámetros de tipo xml . Una constante de cadena sin tipo se coacciona a xml automáticamente, pero un text columna no es. Necesitas lanzar explícitamente.

Esto funciona sin conversión explícita:

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

Un CET como en mi primer ejemplo necesidades un tipo para cada columna en la "expresión de tabla común". Si no hubiera emitido a un tipo específico, el tipo unknown se habría utilizado, lo cual no lo mismo que una cadena sin tipo . Obviamente, no hay una conversión directa implementada entre unknown y xml . Tendrías que enviar a text primero:unknown_type_col::text::xml . Mejor convertir a ::xml enseguida.

Esto se ha reforzado con PostgreSQL 9.1 (creo). Las versiones anteriores eran más permisivas.

De cualquier manera, con cualquiera de estos métodos, la cadena debe ser xml válido o la conversión (implícita o explícita) generará una excepción.