了解 postgres 中的 COALESCE
Understanding COALESCE in postgres
精确问题。
Table ROW
value1 a
value2 b
value3 null
value4 d
函数参数
CREATE OR REPLACE FUNCTION "GetValues"(
"@value1" VARCHAR(50),
"@value2" VARCHAR(50),
"@value3" VARCHAR(50),
"@value4" VARCHAR(50)
)
BEGIN
RETURN QUERY SELECT(
t."value1",
t."value2",
t."value3",
t."value4",
)
FROM "table" as t
WHERE t."value1" = COALESCE("@value1", c."value1")
AND t."value2" = COALESCE("@value2", c."value2")
AND t."value3" = COALESCE("@value3", c."value3")
AND t."value4" = COALESCE("@value4", c."value4");
END;
如果我使用上面的功能,只提供以下内容:
('a', null, null, 'd')
它会 return []
即使找到 'a' 和 'd' 我发现只有当我提供一个参数来搜索某些东西时才会发生这种情况null
并且该行的值也是 null
.
下面的旧描述
我已经设置了一个 get,它使用 COALESCE
成功地通过多个或 1 个参数进行搜索。但是,如果那些未提供的参数中的任何一个(因此默认为 NULL)实际上在数据库中为 NULL 因为我之前没有更新该字段,那么它总是 return 一个空数组,即使一个提供的参数将成功匹配 table.
中的一行
我只是想知道我是否需要一个新系统来完成这个搜索,或者它是否只是 COALESCE
的不幸结果?
下面是相关片段。
FROM "table" as t
WHERE t."value1" = COALESCE("@value1", c."value1")
AND t."value2" = COALESCE("@value2", c."value2")
AND t."value3" = COALESCE("@value3", c."value3")
AND t."value4" = COALESCE("@value4", c."value4");
在上面,如果我提供 value1 并且它匹配但 value4 在该行中为 NULL,那么它将 return [].
return 是一个包含这 4 个值的 table。
你可以这样做:
FROM test as t
WHERE ("@value1" IS NULL OR t."value1" = "@value1")
AND ("@value2" IS NULL OR t."value2" = "@value2")
AND ("@value3" IS NULL OR t."value3" = "@value3")
AND ("@value4" IS NULL OR t."value4" = "@value4");
这应该是一个简单的行比较(给出与输入参数具有相同值的所有行)吗?
这可以通过行比较器 (documentation) 简单地实现:
WHERE row(t.*) IS NOT DISTINCT FROM row("@value1", "@value2", "@value3", "@value4")
如果作为函数输入参数的 NULL
应该是通配符,那么@kurkle 的解决方案效果很好。
精确问题。
Table ROW
value1 a
value2 b
value3 null
value4 d
函数参数
CREATE OR REPLACE FUNCTION "GetValues"(
"@value1" VARCHAR(50),
"@value2" VARCHAR(50),
"@value3" VARCHAR(50),
"@value4" VARCHAR(50)
)
BEGIN
RETURN QUERY SELECT(
t."value1",
t."value2",
t."value3",
t."value4",
)
FROM "table" as t
WHERE t."value1" = COALESCE("@value1", c."value1")
AND t."value2" = COALESCE("@value2", c."value2")
AND t."value3" = COALESCE("@value3", c."value3")
AND t."value4" = COALESCE("@value4", c."value4");
END;
如果我使用上面的功能,只提供以下内容:
('a', null, null, 'd')
它会 return []
即使找到 'a' 和 'd' 我发现只有当我提供一个参数来搜索某些东西时才会发生这种情况null
并且该行的值也是 null
.
下面的旧描述
我已经设置了一个 get,它使用 COALESCE
成功地通过多个或 1 个参数进行搜索。但是,如果那些未提供的参数中的任何一个(因此默认为 NULL)实际上在数据库中为 NULL 因为我之前没有更新该字段,那么它总是 return 一个空数组,即使一个提供的参数将成功匹配 table.
我只是想知道我是否需要一个新系统来完成这个搜索,或者它是否只是 COALESCE
的不幸结果?
下面是相关片段。
FROM "table" as t
WHERE t."value1" = COALESCE("@value1", c."value1")
AND t."value2" = COALESCE("@value2", c."value2")
AND t."value3" = COALESCE("@value3", c."value3")
AND t."value4" = COALESCE("@value4", c."value4");
在上面,如果我提供 value1 并且它匹配但 value4 在该行中为 NULL,那么它将 return [].
return 是一个包含这 4 个值的 table。
你可以这样做:
FROM test as t
WHERE ("@value1" IS NULL OR t."value1" = "@value1")
AND ("@value2" IS NULL OR t."value2" = "@value2")
AND ("@value3" IS NULL OR t."value3" = "@value3")
AND ("@value4" IS NULL OR t."value4" = "@value4");
这应该是一个简单的行比较(给出与输入参数具有相同值的所有行)吗?
这可以通过行比较器 (documentation) 简单地实现:
WHERE row(t.*) IS NOT DISTINCT FROM row("@value1", "@value2", "@value3", "@value4")
如果作为函数输入参数的 NULL
应该是通配符,那么@kurkle 的解决方案效果很好。