我正在搜索一个 sql 查询(我正在使用 Postgres 数据库),它可以从逗号分隔的单个记录中给出所有值。
例如
我有一个名为 master_table 的表,列 no,name,phone
SELECT * FROM master_table WHERE id = 1
从上面的查询我想要结果为
1,piyush,1111111
2,john,2222222
上表只是示例表是动态的,因此列号和名称不能固定。
提前致谢
我正在搜索一个 sql 查询(我正在使用 Postgres 数据库),它可以从逗号分隔的单个记录中给出所有值。
例如
我有一个名为 master_table 的表,列 no,name,phone
SELECT * FROM master_table WHERE id = 1
从上面的查询我想要结果为
1,piyush,1111111
2,john,2222222
上表只是示例表是动态的,因此列号和名称不能固定。
提前致谢
您可以使用 string_agg 来实现上述目标,例如:
SELECT string_agg(id, ',') FROM table
SELECT (column_no::text || ',' || name || ',' || phone::text) AS comma_separated
FROM master_table WHERE id = 1
编辑 :
在您发表评论后,我认为您需要一个功能。即使我不同意整个想法(在应用程序层中这样做会更好),这里有一个函数可以满足您的要求。这是丑陋的。
CREATE OR REPLACE FUNCTION GetCommaSeparatedValues(PAR_table text, PAR_where_clause text DEFAULT '') RETURNS TABLE (
comma_separated_values text
) AS $$
DECLARE
REC_columns record;
VAR_query text;
BEGIN
VAR_query := '';
FOR REC_columns IN SELECT column_name FROM information_schema.columns WHERE table_schema = current_schema AND table_name = PAR_table LOOP
IF VAR_query <> '' THEN
VAR_query := VAR_query || ' || '','' || ';
END IF;
VAR_query := VAR_query || ' CASE WHEN ' || REC_columns.column_name || ' IS NULL THEN ''null'' ELSE ' || REC_columns.column_name || '::text END';
END LOOP;
VAR_query := 'SELECT ' || VAR_query || ' FROM ' || PAR_table::regclass || ' ' || PAR_where_clause;
RETURN QUERY EXECUTE VAR_query;
END;
$$ LANGUAGE plpgsql;
用法:
SELECT * FROM GetCommaSeparatedValues('table1');
或者
SELECT * FROM GetCommaSeparatedValues('table2', 'WHERE id = 1');
直接在SELECT
查询上执行此操作的问题是它会导致一些问题,主要是关于转义。例如,如果您在其中一个记录字符串中有逗号,您将如何处理?
当然,您可以解析字符串并将其转义,但最常见(也是推荐)的方法是使用众所周知的 CSV 格式。并且 PostgreSQL 已经使用COPY
command为您提供了结果,因此您不必重新发明轮子:
COPY (SELECT * FROM master_table WHERE id = 1) TO stdout WITH CSV;
如果您想从 psql shell 获取 csv 格式的数据,只需修改一些 psql 选项您可以使用以下命令来完成
您也可以通过以下命令保存查询结果
例子
postgres=# select * from master_table;
id | string | number
----+--------+---------
1 | piyush | 1111111
2 | john | 2222222
(2 rows)
postgres=# \a
Output format is unaligned.
postgres=# \f ,
Field separator is ",".
postgres=# select * from master_table;
no,name,phone
1,piyush,1111111
2,john,2222222
(2 rows)
postgres=# \o result.csv
postgres=# select * from master_table; => query result is saved in 'result.csv'
postgres=#