简体   繁体   English

根据多个参数搜索postgres表,但不需要全部

[英]Searching a postgres table based upon multiple parameters but not requiring them all

I am trying to create a query where I search through 1 table based upon 4 values. 我正在尝试创建一个查询,其中我基于4个值搜索1个表。 None of these values are required and it should return based upon all of them. 这些值都不是必需的,并且应该基于所有这些值返回。

The below is how I would do it if all values would always be provided. 如果总是提供所有值,则下面是我的处理方法。

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;

The below is how I imagine doing it but I can't get anything like that to work within it. 以下是我想像的操作方式,但无法在其中进行任何操作。

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

Am I supposed to do many individual SELECTS and then combine them all with UNION? 我是否应该做很多单独的选择,然后将它们与UNION结合在一起? I don't think that will work because I only want what matches all criteria to show up? 我认为这行不通,因为我只想显示符合所有条件的内容?

Use COALESCE() : 使用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. 雷斯特的工作例子。

Not related but important. 不相关,但重要。 Using table or column names in double quotes definitely does not make life easier. 在双引号中使用表名或列名绝对不会使工作变得更轻松。 The name "values" for a table may be considered a bad practice. 表的名称“值”可能被认为是不良做法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM