[英]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.