如何编写SQL查询以从记录中获取按列逗号分隔的值列表
我正在搜索一个sql查询(我使用的是Postgres数据库),它可以以逗号分隔的形式给出单个记录中的所有值 e、 g 我有一个名为master_table的表,有列no、name、phone如何编写SQL查询以从记录中获取按列逗号分隔的值列表,sql,postgresql,Sql,Postgresql,我正在搜索一个sql查询(我使用的是Postgres数据库),它可以以逗号分隔的形式给出单个记录中的所有值 e、 g 我有一个名为master_table的表,有列no、name、phone SELECT * FROM master_table WHERE id = 1 从上面的查询中,我希望得到结果 1,piyush,1111111 2,john,2222222 上表是示例,只有表是动态的,所以列号和名称不能固定 提前谢谢 SELECT (column_no::text || ',' ||
SELECT * FROM master_table WHERE id = 1
从上面的查询中,我希望得到结果
1,piyush,1111111
2,john,2222222
上表是示例,只有表是动态的,所以列号和名称不能固定
提前谢谢
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;
或
编辑:
在你的评论之后,我想你需要一个函数。即使我不同意整个想法(最好在应用程序层这样做),这里有一个函数可以满足您的要求。它很难看
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;
或
您可以使用string_agg实现上述功能,例如:
SELECT string_agg(id, ',') FROM table
参考:您可以使用string\u agg实现上述功能,例如:
SELECT string_agg(id, ',') FROM table
Ref:直接在
SELECT
查询上执行此操作的问题在于它会导致一些问题,主要是关于转义。例如,如果在一个记录字符串中有一个逗号,您将如何处理它
当然,您可以解析字符串并对其进行转义,但最常见(也是推荐的)方法是使用众所周知的CSV格式。PostgreSQL已经通过使用提供了这样的结果,因此您不必重新发明轮子:
COPY (SELECT * FROM master_table WHERE id = 1) TO stdout WITH CSV;
直接在
SELECT
查询上执行此操作的问题在于它会导致一些问题,主要是关于转义。例如,如果在一个记录字符串中有一个逗号,您将如何处理它
当然,您可以解析字符串并对其进行转义,但最常见(也是推荐的)方法是使用众所周知的CSV格式。PostgreSQL已经通过使用提供了这样的结果,因此您不必重新发明轮子:
COPY (SELECT * FROM master_table WHERE id = 1) TO stdout WITH CSV;
如果您想从psqlshell获取csv格式的数据,只需修改一些psql选项 您可以使用下面的命令来完成
- \a:在未对齐和对齐输出模式之间切换
- \f[字符串]:显示或设置未对齐查询输出的字段分隔符
- \o[文件]:将所有查询结果发送到文件或|管道
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=#
如果您想从psqlshell获取csv格式的数据,只需修改一些psql选项 您可以使用下面的命令来完成
- \a:在未对齐和对齐输出模式之间切换
- \f[字符串]:显示或设置未对齐查询输出的字段分隔符
- \o[文件]:将所有查询结果发送到文件或|管道
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=#
请在这里找到,请在这里找到,Hello string_agg函数从一列中的不同记录中提供逗号分隔的值,我需要从不同的列中获取值Shello string_agg函数从一列中的不同记录中提供逗号分隔的值,我需要从不同的列中获取值Shello谢谢您的回答,但在我的情况下,我需要这种类型的值通过单个查询为不同的表指定值。所以我无法决定列号或名称。我需要像循环通过列这样的东西。请举例说明。您正在寻找一个查询,以获取任何给定表中每个记录的所有字段的逗号分隔值的字符串表示形式?pl/pgsql函数似乎是一种可行的方法。您好,谢谢您的回答,但在我的例子中,我需要通过单个查询为不同的表提供这种值。所以我无法决定列号或名称。我需要像循环通过列这样的东西。请举例说明。您正在寻找一个查询,以获取任何给定表中每个记录的所有字段的逗号分隔值的字符串表示形式?pl/pgsql函数似乎是一种可行的方法。