如何动态查询列名?

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_textrow_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;