我编写了以下函数,该函数应该从给定xpath_str
的输入file_name
求值为的模块返回UUID。
以下不返回任何内容。问题区域是xpath_exists
。
CREATE OR REPLACE FUNCTION find_xpath(xpath_str text, file_name text)
RETURNS TABLE(uuid uuid)
AS
$$
BEGIN
RETURN QUERY
SELECT m.uuid
FROM modules m
NATURAL JOIN module_files mf
NATURAL JOIN files f
WHERE xpath_exists(xpath_str, convert_from(f.file,'utf8')::xml)
AND mf.filename = file_name;
EXCEPTION WHEN OTHERS THEN
--ignore a malformed xml doc
END
$$
LANGUAGE plpgsql;
我已经尝试了大量的等价检查变体来看xpath_exists
是真的。似乎没有用。
奇怪的是,如果我删除了WHERE
而是返回result
xpath_exists
的另一列,那么请从该函数中选择结果:
SELECT uuid FROM find_xpath('xpath string', 'file name') WHERE result = 't'
然后它的工作原理。见下文。
CREATE OR REPLACE FUNCTION find_xpath(xpath_str text, file_name text)
RETURNS TABLE(uuid uuid, result boolean)
AS
$$
BEGIN
RETURN QUERY
SELECT m.uuid,
xpath_exists(xpath_str, convert_from(f.file,'utf8')::xml)
FROM modules m
NATURAL JOIN module_files mf
NATURAL JOIN files f
WHERE mf.filename = file_name;
EXCEPTION WHEN OTHERS THEN
--ignore a malformed xml doc
END
$$
LANGUAGE plpgsql;
似乎某种方式WHERE
语句的位置搞砸了?