WHERE xpath_exists子句在函数

时间:2017-07-31 19:20:19

标签: sql postgresql xpath plpgsql

我编写了以下函数,该函数应该从给定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语句的位置搞砸了?

0 个答案:

没有答案