例如,我想计算表中每一行的空字段。
我应该使用什么参数类型声明?
我尝试了复合类型(表名作为类型):
CREATE FUNCTION count_null (row my_table)
RETURNS INTEGER
AS $$
return len([x for x in row if x is None])
$$ LANGUAGE plpythonu;
但如果我这样称呼它,它与参数类型不匹配:
SELECT count_null(*) FROM my_table;
例如,我想计算表中每一行的空字段。
我应该使用什么参数类型声明?
我尝试了复合类型(表名作为类型):
CREATE FUNCTION count_null (row my_table)
RETURNS INTEGER
AS $$
return len([x for x in row if x is None])
$$ LANGUAGE plpythonu;
但如果我这样称呼它,它与参数类型不匹配:
SELECT count_null(*) FROM my_table;
假设您使用的是 Postgres >= 9.3,您可以使用 json 转换来完成此操作,如下所示:
create or replace function count_null(
_r json
) returns integer as $$
select
count(1)::integer
from
(
select
row_to_json(json_each(_r)) as condensed_record
) as __base
where
condensed_record->>'value' is null;
$$ language sql immutable;
---------
select
count_null(row_to_json(my_table))
from
my_table;
这具有使用语言 SQL 而不是 plpythonu 的额外好处,因此查询规划器可以在一定程度上对其进行优化。