PostgreSQL:计算一行中包含值的列数

标签 postgresql

假设我有一个包含以下列的表格:

ID

第 1 列

第2栏

第3栏

第 4 栏

。 .

*请注意,我有 50 个这样的列 ('col1'...'col50')

对于每一行,我想计算以“col”开头的列数(例如 col1、col2 等),这些列还包含特定的整数值(例如 0)。

如果我的数据是:

Id, Col1, Col2, Col3, Col4
0, 0, 1, 2, 1
1, 1, 2, 0, 1
2, 1, 0, 5, 0
3, 0, 0, 0, 4

我的结果是:

Id, Count
0, 1
2, 1
2, 2
3, 3

显然这需要扩展到 50 列,所以我不想对列名称进行硬编码(我需要使其动态/循环)。我还将用我正在寻找的其他值重复这一点,问题的实质可以简化为上述结果。

我不知道如何实现这一点。我想到了一个函数,它接受列名、查找值和计数器,然后返回总的和当前的计数器位置或其他内容。我必须执行 WHILE 循环来调用该函数,直到达到结束计数器。

目标是替换一些有用但令人眼花缭乱且不可重复使用的东西(有 50 列):

case col1 当 0 then 1 else 0 end + case col col1 当 0 then 1 else 0 end...

最佳答案

with t(id, col1, col2, col3, col4) as (values
  (0,0,1,2,1),
  (3,0,0,0,4))
select * from t cross join lateral (
  select count(*) as cnt
  from json_each_text(to_json(t))
  where key like 'col%' and value = '0') as j;

Demo通过 lad2925 (三)

More about JSON functions.

关于PostgreSQL:计算一行中包含值的列数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50143270/

相关文章:

macos - Postgres.app 无法启动

sql - PostgreSQL:将间隔添加到不同时区的时间戳

sql - 如何聚合 postgres 中的 jsonb 元素行?

sql - postgresql 中的 boolean 通配符

ruby-on-rails - 使用 rspec 进行测试会出现错误 : 'Please install the sqlite3 adapter' - railstutorial. org

postgresql - 如何向 postgresql 模式中的所有表添加一列

javascript - 使用 Leafletjs 显示 PostGIS 数据

postgresql - postgres 差异工具

json - PostgreSQL - 在不指定键的情况下聚合 JSON 对象中的值

sql - 有什么方法可以使用 select 语句生成 postgres 注释吗?