如果keyword为null则获取所有行,否则返回匹配

时间:2018-04-10 11:56:20

标签: node.js postgresql plpgsql postgresql-9.1 postgresql-9.3

我在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;

2 个答案:

答案 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在同一会话中重复执行时保存查询计划。

相关: