【发布时间】:2018-05-15 23:58:00
【问题描述】:
我有这个功能http://rextester.com/VIHMIG61446
CREATE OR REPLACE FUNCTION myTestProcedure(namevalue character varying)
RETURNS TABLE(id integer, name character varying, isdefault boolean)
LANGUAGE plpgsql
AS $function$
BEGIN
IF EXISTS(SELECT
Domain.id,
Domain.name,
Domain.isdefault
FROM Domain
where lower(Domain.name) like namevalue)
THEN
RETURN QUERY SELECT
Domain.id,
Domain.name,
Domain.isdefault
FROM Domain
where lower(Domain.name) like namevalue;
ELSE
RETURN QUERY SELECT
Domain.id,
Domain.name,
Domain.isdefault
FROM Domain
where Domain.isdefault = true;
END IF;
END
$function$;
我正在寻找一种不重复 if 的整个查询的方法,所以我决定使用with as 来存储结果,但它对我不起作用http://rextester.com/MVMVA73088
我应该如何使用with as?
CREATE OR REPLACE FUNCTION myTestProcedure(namevalue character varying)
RETURNS TABLE(id integer, name character varying, isdefault boolean)
LANGUAGE plpgsql
AS $function$
BEGIN
with temporal_result as (
SELECT
Domain.id,
Domain.name,
Domain.isdefault
FROM Domain
where lower(Domain.name) like namevalue
)
IF EXISTS(temporal_result)
THEN
RETURN QUERY SELECT * from temporal_result;
ELSE
RETURN QUERY SELECT
Domain.id,
Domain.name,
Domain.isdefault
FROM Domain
where Domain.isdefault = true;
END IF;
END
$function$;
【问题讨论】:
-
不是您问题的完全答案,但我找到了一种方便的方法来选择特定记录并在它不存在时回退到默认值,即使用第一个查询
UNION ALL第二个查询,然后是LIMIT 1。这还有一个优点,它可以是一个普通的旧LANGUAGE SQL函数,可以内联。
标签: sql postgresql plpgsql