Postgres: проверка возвратов из xpath () - PullRequest
0 голосов
/ 03 февраля 2011

У меня есть SQL-выражение вроде:

select coalesce(nullif(xpath('//consumer/contact_address/\@postcode', xml),'{}'), '') from consumer where docid = 12345; 

Это дает мне ошибку:

ERROR:  array value must start with "{" or dimension information

Что это вообще значит? Кроме того, если я пытаюсь использовать интерактивное приглашение psql, я получаю еще одну загадочную ошибку:

#psql: select nullif(xpath('//consumer/contact_address/\@street', xml),  '{}') from consumer where docid = 12345;
WARNING:  nonstandard use of escape in a string literal
LINE 1: select nullif(xpath('//consumer/contact_address/\@street', x...
                        ^
HINT:  Use the escape string syntax for escapes, e.g., E'\r\n'.
ERROR:  could not identify an equality operator for type xml

Что здесь не так? Спасибо!

1 Ответ

0 голосов
/ 03 февраля 2011

Вы хотите:

select coalesce(nullif(xpath('//consumer/contact_address/\@postcode', xml),'{}'::xml[]), '') 
  from consumer 
 where docid = 12345; 

Обратите внимание на приведение к массиву xml, но, к сожалению, для xml [] нет оператора равенства. Так что вам придется сделать это:

select CASE WHEN array_upper(xpath('//consumer/contact_address/\@postcode', xml)) = 1 
            THEN xpath('//consumer/contact_address/\@postcode', xml) END
  from consumer 
 where docid = 12345; 

Не проверено, поиграйте с верхней границей, возможно, вам придется проверить нулевое значение против. Не волнуйтесь, PostgreSQL обнаруживает аналогичные подформулы и оценивает выражение xpath только один раз.

Предупреждение приводит к использованию символов Escape в строковых литералах, что соответствует бот-SQL, но возможно. Используйте E'Next \ n line 'или отключите эту проверку в postgresql.conf!

...