如何动态查询列名?

时间:2015-09-29 09:32:13

标签: sql postgresql select metadata

考虑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语句也可以)?

示例:

enter image description here

2 个答案:

答案 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_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;