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問題は、いくつかの問題が発生することです。プリンシパルはエスケープに関するものです。たとえば、レコード文字列の 1 つにコンマがある場合、それをどのように処理しますか?

もちろん、文字列を解析してエスケープすることもできますが、最も一般的な (そして推奨される) 方法は、よく知られている CSV 形式を使用することです。また、PostgreSQL はすでにCOPYコマンドを使用して結果を提供しているため、車輪を再発明する必要はありません。

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

If you like to get csv formatted data from psql shell, just modify some psql option You can do it using below command

  • \a: toggle between unaligned and aligned output mode
  • \f [STRING]: show or set field separator for unaligned query output

also you can save query results by below command

  • \o [FILE]: send all query results to file or |pipe

Example

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 に答える