考虑PostgreSQL DBMS(9.3)的以下SQL代码:
SELECT
column_name, (SELECT count(*) FROM _TABLE_NAME_ WHERE column_name = 'X')
FROM
information_schema.columns
WHERE
table_schema = '_SCHEMA_NAME_'
AND
table_name = '_TABLE_NAME_';
我想使用内部查询中外部查询中检索到的column_names作为列名(meta)。有没有办法在一个SELECT语句中执行此操作(多个内部SELECT语句也可以)?
示例:
答案 0 :(得分:1)
您不需要元表,您需要一个unpivot查询。有了合理的最新pg,您可以使用JSON functions来实现它:
SELECT key
,count(*) FILTER (WHERE value = 'X')
FROM _TABLE_NAME_
,json_each_text(row_to_json( _TABLE_NAME_)) AS unpivot
GROUP BY key;
答案 1 :(得分:1)
这不是我的工作。我问了一位同事,在Jakub Kania与json_each_text
和row_to_json
的想法之后,他找到了以下解决方案,这完全回答了我的问题。
SELECT
k, sum((v = 'X')::INT)
FROM
(
SELECT
(json_each_text(row_to_json(_TABLE_NAME_WITHOUT_SCHEMA_))).KEY AS k,
(json_each_text(row_to_json(_TABLE_NAME_WITHOUT_SCHEMA_))).VALUE AS v
FROM
_TABLE_NAME_
) AS tmp
GROUP BY k;