gpt4 book ai didi

postgresql - 了解 postgres 中的 COALESCE

转载 作者:行者123 更新时间:2023-11-29 14:14:57 24 4
gpt4 key购买 nike

精确的问题。

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')

它将返回 []即使找到了“a”和“d”,而且我发现只有在我提供一个参数来搜索 null 的内容时才会发生这种情况。并且该行的值也是 null .

下面的旧描述

我已经设置了一个使用 COALESCE 的 get成功地通过多个或 1 个参数进行搜索。但是,如果那些未提供的参数中的任何一个(因此默认为 NULL)实际上在数据库中为 NULL,因为我之前没有更新该字段,那么它将始终返回一个空数组,即使提供的参数之一将成功匹配到表中的一行。

我只想知道我是否需要一个新系统来完成这个搜索,或者这是否只是 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,那么它将返回 []。

返回的是一个包含这 4 个值的表格。

最佳答案

这应该是一个简单的行比较(给出与输入参数具有相同值的所有行)吗?

这可以简单地通过行比较器 ( documentation ) 实现:

WHERE row(t.*) IS NOT DISTINCT FROM row("@value1", "@value2", "@value3", "@value4")

demo: db<>fiddle

如果作为函数输入参数的 NULL 应该是通配符,那么@kurkle 的解决方案效果很好。

关于postgresql - 了解 postgres 中的 COALESCE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52319573/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com