我在Postgres中有一个plpgsql函数。当关键字不为null并返回匹配结果时,它工作正常,但当关键字为null时,我想忽略它并返回任意行。
CREATE OR REPLACE FUNCTION get_all_companies(_keyword varchar(255))
RETURNS TABLE(
id INTEGER,
name VARCHAR,
isactive boolean
) AS $$
BEGIN
RETURN Query
SELECT c.id, c.name, c.isactive FROM companydetail AS c
WHERE c.name ~* _keyword LIMIT 50 ;
END;$$
LANGUAGE plpgsql;
答案 0 :(得分:2)
验证它是否为空或是否为空:
RETURN QUERY
SELECT c.id, c.name, c.isactive
FROM companydetail AS c
WHERE _keyword IS NULL
OR _keyword = ''::varchar(255)
OR c.name ~* _keyword
LIMIT 50 ;
答案 1 :(得分:1)
@jahuuar provided a simple and elegant solution with a single SELECT
使用单个查询解决此问题(如果需要,还可以跳过空字符串)。你不需要plpgsql甚至是一个函数。
使用plpgsql时,您可以优化性能:
CREATE OR REPLACE FUNCTION get_all_companies(_keyword varchar(255))
RETURNS TABLE(id INTEGER, name VARCHAR, isactive boolean) AS
$func$
BEGIN
IF _keyword <> '' THEN -- exclude null and empty string
RETURN QUERY
SELECT c.id, c.name, c.isactive
FROM companydetail AS c
WHERE c.name ~* _keyword
LIMIT 50;
ELSE
RETURN QUERY
SELECT c.id, c.name, c.isactive
FROM companydetail AS c
LIMIT 50;
END IF;
END
$func$ LANGUAGE plpgsql;
Postgres可以通过这种方式为两个不同的查询使用单独的优化计划。第一个查询的trigram GIN索引扫描(当然需要匹配的索引 - 请参阅下面的链接),第二个查询的顺序扫描。并且PL / pgSQL在同一会话中重复执行时保存查询计划。
相关: