【问题标题】:Postgresql: write user function with coalesce-like behaviourPostgresql:编写具有类似合并行为的用户函数
【发布时间】:2015-11-29 00:05:03
【问题描述】:

我想写一个函数,计算输入的非空值。我的解决方案是:

CREATE FUNCTION
  count_not_null (VARIADIC args anyarray) RETURNS BIGINT
  AS $$
    SELECT COUNT(x) FROM unnest(args) as x
  $$ LANGUAGE SQL IMMUTABLE
;

当输入包含至少一个非空值时,这个函数就像一个魅力。但如果输入只包含空值(如SELECT count_not_null(null, null)),则错误

"错误:无法确定多态类型,因为输入具有类型 “未知”

抛出。但是如果我们查看COALESCE,它会处理这种情况:只返回null。如何获得用户定义函数的一些行为?

【问题讨论】:

  • 您可能不想(或不能)转换我猜的参数? select count_not_null(null::bigint, null::bigint)
  • SELECT count_not_null(null::int, null::int),可能吗?
  • 当然可以转换参数,但是我想实现COALESCE函数的行为。
  • 您也可以通过提供具有具体类型的版本来解决它。我不确定这是否会导致该类型的类型解析问题,但我不这么认为......

标签: postgresql null coalesce


【解决方案1】:

基于 Craig Ringer 的评论,以下适用于 PostgreSQL 9.4:

CREATE FUNCTION
  count_not_null (VARIADIC args anyarray) RETURNS BIGINT
  AS $$
    SELECT COUNT(x) FROM unnest(args) as x
  $$ LANGUAGE SQL IMMUTABLE
;

-- Overloading with a version that expects a TEXT array
CREATE FUNCTION
  count_not_null (VARIADIC args TEXT[]) RETURNS BIGINT
  AS $$
    SELECT COUNT(x) FROM unnest(args) as x
  $$ LANGUAGE SQL IMMUTABLE
;  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 2022-01-10
    相关资源
    最近更新 更多