postgresql - 根据多个参数搜索 postgres 表但不需要所有参数

标签 postgresql filtering union

我正在尝试创建一个查询,根据 4 个值搜索 1 个表。这些值都不是必需的,它应该基于所有这些值返回。

如果始终提供所有值,下面是我将如何做。

CREATE OR REPLACE FUNCTION "GetValues"(
  "@value1"                TEXT,
  "@value2"                TEXT,
  "@value3"                TEXT
  "@value4"                TEXT
)
RETURNS TABLE(
  "id"                     UUID,
  "@value1"                TEXT,
  "@value2"                TEXT,
  "@value3"                TEXT
  "@value4"                TEXT  
) AS
$func$
BEGIN
  RETURN QUERY SELECT
    c."id",
    c."value1",
    c."value2",
    c."value3",
    c."value4"
  FROM "values" AS v
  WHERE "value1" = "@value1"
  AND "value2" = "@value2"
  AND "value3" = "@value3"
  AND "value4" = "@value4";
END;
$func$ LANGUAGE PLPGSQL;

下面是我想象中的做法,但我无法在其中进行任何类似的工作。

IF ("@value1" IS NOT NULL) THEN
  WHERE "value1" = "@value1"
END IF;

我是否应该做很多单独的 SELECTS,然后将它们与 UNION 结合起来?我认为这行不通,因为我只希望显示符合所有条件的内容?

最佳答案

使用COALESCE():

SELECT
    "id",
    "value1",
    "value2",
    "value3",
    "value4"
FROM "values"
WHERE "value1" = COALESCE("@value1", "value1")
AND "value2" = COALESCE("@value2", "value2")
AND "value3" = COALESCE("@value3", "value3")
AND "value4" = COALESCE("@value4", "value4")

Working example in rextester.

不相关但很重要。在双引号中使用表名或列名绝对不会让生活更轻松。表的名称“值”可能被认为是一种不好的做法。

关于postgresql - 根据多个参数搜索 postgres 表但不需要所有参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52174589/

相关文章:

sql - Postgres : select all row with count of a field greater than 1

ruby-on-rails - 服务器是否在主机 "localhost"(::1) 上运行并在端口 5432 上接受 TCP/IP 连接?

PHP-PDO_PGSQL - SQLSTATE[HY093] : Invalid parameter number

javascript - D3js过滤器选择

革命 R : filter an xdf using another xdf

MySQL UNION 查询语法

mysql - 仅在 UNION mysql 中的一个查询中排序

json - 函数的 postgres json 参数

sql - 从数据库中计算最稳定、连续的值的算法

mysql - 无序的 SQL 组合主键(任意顺序的整数对必须是唯一的)