Извлечение значения xml-тега в PostgreSQL
Ниже приведен ответ столбца из моей таблицы Postgres. Я хочу, чтобы извлечь все строки в моей базе данных Postgres. Статус может быть разных размеров, таких как SUCCESS
также, поэтому я не хочу использовать функцию подстроки. Есть ли способ сделать это?
<?xml version="1.0" ?><response><status>ERROR_MISSING_DATA</status><responseType>COUNTRY_MISSING</responseType><country_info>USA</country_info><phone_country_code>1234</phone_country_code></response>
Итак, моя структура таблицы выглядит так
Column | Type | Modifiers
-------------+-----------------------------+----------------------------------------------------------
id | bigint | not null default nextval('events_id_seq'::regclass)
hostname | text | not null
time | timestamp without time zone | not null
trn_type | text |
db_ret_code | text |
request | text |
response | text |
wait_time | text |
и я хочу извлечь статус из каждого запроса. Как мне это сделать?
Ниже приведен пример строки. И примите таблицу abc_events имя
id | 1870667
hostname | abcd.local
time | 2013-04-16 00:00:23.861
trn_type | A
request | <?xml version="1.0" ?><response><status>ERROR_MISSING_DATA</status><responseType>COUNTRY_MISSING</responseType><country_info>USA</country_info><phone_country_code>1234</phone_country_code></response>
response | <?xml version="1.0" ?><response><status>ERROR_MISSING_DATA</status><responseType>COUNTRY_MISSING</responseType><country_info>USA</country_info><phone_country_code>1234</phone_country_code></response>
1 ответов
использовать xpath()
функция:
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()
полоски окрестных <status>
тег.
Возвращает массив xml
- С одним элементом в этом случае:
status
xml[]
-------
{ERROR_MISSING_DATA}
применяется к вашему столу
в ответ на ваш вопрос обновить, это может быть:
SELECT id, xpath('./status/text()', response::xml) AS status
FROM tbl;
если вы уверены, что есть только один тег состояния в строке, вы можете просто извлечь первый элемент из массив:
SELECT id, (xpath('./status/text()', response::xml))[1] AS status
FROM tbl;
если может быть несколько элементов состояния:
SELECT id, unnest(xpath('./status/text()', response::xml)) AS status
FROM tbl;
получает 1-n строк на id
.
бросил xml
поскольку вы определили, что ваши столбцы имеют тип text
(вместо xml
, вы нужно бросить в xml
явно. Функция xpath()
ожидает 2-й параметры типа xml
. Нетипизированная строковая константа принуждается к xml
автоматически, но text
колонки нет. Вам нужно бросить явно.
это работает без явного приведения:
SELECT xpath('./status/text()'
,'<?xml version="1.0" ?><response><status>SUCCESS</status></response>')
A CTE как в моем первом примере должен тип для каждого столбца В "общем табличном выражении". Если бы я не привел к определенному типу, тип unknown
было бы использовано-что не то же самое как строку типа. Очевидно, что прямого преобразования нет реализовано между unknown
и xml
. Вам придется бросить в text
первый: unknown_type_col::text::xml
. Лучше бросить в ::xml
сразу.
это было затянуто с помощью PostgreSQL 9.1 (я думаю). Старые версии были более терпимыми.
в любом случае, с любым из этих методов строка должна быть действительный xml или приведение (неявное или явное) вызовет исключение.