如果关键字为 null 则获取所有行 else return 匹配

Get all rows if keyword is null else return matching

我在 Postgres 中有一个 plpgsql 函数。当关键字不为 null 并且 returning 匹配结果时它工作正常但是当关键字为 null 我想忽略它并且 return 任意行。

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;

验证它是否为 NULL 或为空:

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 ;

通过单个查询解决此问题(如果需要,也可以跳过空字符串)。您不需要 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 在同一会话中重复执行时保存查询计划。

相关:

  • Best way to check for "empty or null value"
  • Difference between LIKE and ~ in Postgres
  • PostgreSQL LIKE query performance variations
  • Difference between language sql and language plpgsql in PostgreSQL functions