了解Postgres中的COALESCE

时间:2018-09-13 18:12:53

标签: postgresql coalesce postgresql-9.6

精确的问题。

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

下面的旧说明

我已经设置了一个get,它成功使用COALESCE来按多个或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,则它将返回[]。

返回值是一个表,其中包含这四个值。

2 个答案:

答案 0 :(得分:2)

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

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

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

demo: db<>fiddle

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

答案 1 :(得分:1)

您可以这样做:

  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");

db<>fiddle