如何动态查询列名?
How to dynamically query for a column name?
考虑以下用于 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 作为列名(元)。有没有办法在一个 SELECT 语句中执行此操作(多个内部 SELECT 语句也可以)?
示例:
您不需要元表,您需要一个逆透视查询。使用相当新的 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;
这不是我的作品。我问了一位同事,在 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;
考虑以下用于 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 作为列名(元)。有没有办法在一个 SELECT 语句中执行此操作(多个内部 SELECT 语句也可以)?
示例:
您不需要元表,您需要一个逆透视查询。使用相当新的 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;
这不是我的作品。我问了一位同事,在 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;