0

我正在搜索一个 sql 查询(我正在使用 Postgres 数据库),它可以从逗号分隔的单个记录中给出所有值。

例如

我有一个名为 master_table 的表,列 no,name,phone

SELECT * FROM master_table WHERE id = 1

从上面的查询我想要结果为

1,piyush,1111111
2,john,2222222

上表只是示例表是动态的,因此列号和名称不能固定。

提前致谢

4

4 回答 4

2

您可以使用 string_agg 来实现上述目标,例如:

SELECT string_agg(id, ',') FROM table

参考:http ://www.craigkerstiens.com/2013/04/17/array-agg/

于 2013-10-07T10:26:48.527 回答
2
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');
于 2013-10-07T10:20:27.527 回答
1

直接在SELECT查询上执行此操作的问题是它会导致一些问题,主要是关于转义。例如,如果您在其中一个记录字符串中有逗号,您将如何处理?

当然,您可以解析字符串并将其转义,但最常见(也是推荐)的方法是使用众所周知的 CSV 格式。并且 PostgreSQL 已经使用COPYcommand为您提供了结果,因此您不必重新发明轮子:

COPY (SELECT * FROM master_table WHERE id = 1) TO stdout WITH CSV;
于 2013-10-07T11:52:18.977 回答
1

如果您想从 psql shell 获取 csv 格式的数据,只需修改一些 psql 选项您可以使用以下命令来完成

  • \a:在未对齐和对齐输出模式之间切换
  • \f [STRING]:显示或设置未对齐查询输出的字段分隔符

您也可以通过以下命令保存查询结果

  • \o [FILE]: 将所有查询结果发送到文件或 |pipe

例子

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=# 
于 2013-10-07T12:09:44.437 回答