Вы хотите:
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!