2015-11-10 4 views
4

Есть ли способ отбрасывать возвращаемый массив XML в массив INT при использовании xpath в Postgres 9.5? По-видимому, я могу назначить его массиву INT перед его использованием, но я не могу понять, как использовать его непосредственно в предложении where. Ниже приведен пример того, как я его сейчас использую.Как передать xpath массив xml в массив int в Postgres

CREATE OR REPLACE FUNCTION people_get_by_ids(_xml XML) 
RETURNS SETOF people AS 
$$ 
DECLARE 
    _ids INT[] = (xpath('/ITEMS/ITEM/VALUE/text()', _xml)); 
BEGIN 
    RETURN QUERY 
     SELECT * 
     FROM people 
     WHERE id = ANY(_ids); 
END 
$$ LANGUAGE plpgsql STABLE; 

Я бы тогда называть это как так

SELECT * FROM people_get_by_ids('<ITEMS><ITEM><VALUE>488</VALUE></ITEM><ITEM><VALUE>489</VALUE></ITEM></ITEMS>'); 

Было бы хорошо, если бы был простой и производительный способ не использовать _ids переменной и просто поставить XPATH часть в ИНЕКЕ.

мне нужно сделать это в нескольких местах и ​​план по созданию функции, чтобы обернуть (xpath('/ITEMS/ITEM/VALUE/text()', _xml)) часть в

ответ

5

я был в состоянии сделать это с xml[] -> varchar[] -> integer[] гипсе:.

WITH test_xml(data) AS (VALUES 
    ('<ROOT><INPUT attr="1"/></ROOT>'::XML)   
), int_array AS (
    SELECT (((xpath('//INPUT/@attr',test_xml.data))::varchar[])::integer[]) as value FROM test_xml 
) 
SELECT value,pg_typeof(value) FROM int_array; 

Результат:

value | pg_typeof 
-------+----------- 
{1} | integer[] 
(1 row) 
+0

Спасибо! Я ранее пробовал кастинг, но делал :: varchar :: integer вместо :: varchar [] :: integer [] – Billy

Смежные вопросы