Postgres动态选择所有文本列 - 子查询?

时间:2014-01-22 10:28:10

标签: sql postgresql

我想要一个select,它返回表中type =“character varying”的所有字段。它需要跨多个表运行,因此需要是动态的。

我试图使用子查询首先获取文本列,然后运行查询:

SELECT (SELECT STRING_AGG(QUOTE_IDENT(column_name), ', ') FROM 
information_schema.columns WHERE table_name = foo 
AND data_type = 'character varying') FROM foo;

但这不起作用,我只是得到一个列名列表而不是值。有谁知道我怎么能让它发挥作用或更好的方法呢?

谢谢你, 本

1 个答案:

答案 0 :(得分:0)

你需要P1 / PgSQL,因为PostgreSQL不支持纯SQL语言中的动态SQL。

CREATE OR REPLACE FUNCTION get_cols(target_table text) RETURNS SETOF record AS $$
DECLARE
    cols text;
BEGIN
    cols := (SELECT STRING_AGG(QUOTE_IDENT(column_name), ', ')
             FROM information_schema.columns 
             WHERE table_name = target_table 
             AND data_type = 'character varying');

    RETURN QUERY EXECUTE 'SELECT '||cols||' FROM '||quote_ident(target_table)||';';
END;
$$
LANGUAGE plpgsql;

但是,您会发现这很难调用,因为您需要知道结果列列表才能调用它。那种打败了这一点。您需要将结果按摩成混凝土类型。我在这里转换为hstore,但您可以返回json或数组或其他任何内容,真的:

CREATE OR REPLACE FUNCTION get_cols(target_table text) RETURNS SETOF hstore AS $$
DECLARE
    cols text;
BEGIN
    cols := (SELECT STRING_AGG(QUOTE_IDENT(column_name), ', ')
             FROM information_schema.columns 
             WHERE table_name = target_table 
             AND data_type = 'character varying');

    RETURN QUERY EXECUTE 'SELECT hstore(ROW('||cols||')) FROM '||quote_ident(target_table)||';';
END;
$$
LANGUAGE plpgsql;

动态SQL很痛苦,请考虑在应用程序级别执行此操作。