Kin*_*han 6 sql postgresql null count plpgsql
我想在表中添加一个新列,以记录每个元组(行)的值为null的属性数.如何使用SQL获取数字?
例如,如果元组是这样的:
Name | Age | Sex
-----+-----+-----
Blice| 100 | null
Run Code Online (Sandbox Code Playgroud)
我想更新元组,如下所示:
Name | Age | Sex | nNULL
-----+-----+-----+--------
Blice| 100 | null| 1
Run Code Online (Sandbox Code Playgroud)
另外,因为我正在编写PL/pgSQL函数并且表名是从参数获得的,所以我事先并不知道表的模式.这意味着我需要使用输入表名更新表.有人知道怎么做吗?
您可以在不拼写列的情况下使用它.将列旋转到行和计数.聚合函数count()仅计算非空值,而count(*)计算所有行.为多个列计算NULL值的最短和最快的方法是count(*) - count(col)......
适用于具有任意数量的数据类型列的任何表.any
在Postgres 9.3+中,内置JSON函数:
SELECT *
, (SELECT count(*) - count(v) FROM json_each_text(row_to_json(t)) x(k,v)) AS ct_nulls
FROM tbl t;
Run Code Online (Sandbox Code Playgroud)
x(k,v)?json_each_text()返回一列或两列的行.默认列名称key和我链接到value的手册中可以看到.我提供了表和列别名,因此我们不必依赖默认名称.第二列是命名的v.
或者,在任何Postgres版本中,至少8.3 hstore安装了附加模块,甚至更短,更快一点:
SELECT *, (SELECT count(*) - count(v) FROM svals(hstore(t)) v) AS ct_nulls
FROM tbl t;
Run Code Online (Sandbox Code Playgroud)
这个更简单的版本只返回一组单个值.我只提供一个简单的别名v,它自动被视为表和列别名.
由于附加列在功能上是相关的,我认为根本不会将其保留在表中.而是像上面演示的那样在运行中计算它,或者为了这个目的创建一个具有多态输入类型的微小函数:
CREATE OR REPLACE FUNCTION f_ct_nulls(_row anyelement)
RETURNS int AS
$func$
SELECT (count(*) - count(v))::int FROM svals(hstore(_row)) v
$func$ LANGUAGE sql IMMUTABLE;
Run Code Online (Sandbox Code Playgroud)
然后:
SELECT *, f_ct_nulls(t) AS ct_nulls
FROM tbl t;
Run Code Online (Sandbox Code Playgroud)
VIEW如果你想要的话,你可以把它包装成一个......
SQL Fiddle演示了所有.
这也应该回答你的第二个问题:
...表名是从参数中获取的,我事先并不知道表的模式.这意味着我需要使用输入表名更新表.
| 归档时间: |
|
| 查看次数: |
950 次 |
| 最近记录: |