我想要一个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;
但这不起作用,我只是得到一个列名列表而不是值。有谁知道我怎么能让它发挥作用或更好的方法呢?
谢谢你, 本
答案 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很痛苦,请考虑在应用程序级别执行此操作。