2013-10-07 46 views
0

我正在尋找一個SQL查詢(我使用的是Postgres數據庫),可以從逗號分隔單個記錄的所有值。如何編寫SQL查詢以獲得列明智的逗號分隔值列表從記錄

例如

我有一個表,名爲master_table且列沒有,姓名,電話

SELECT * FORM master_table WHERE id = 1 

從上面查詢我想結果爲

1,piyush,1111111 
2,john,2222222 

上述表格例如只表是動態的,所以列號並且名稱不能修復。

在此先感謝

+0

請在這裏找到, http://stackoverflow.com/questions/14612394/query-for-comma-separated-ids-to-comma-separated-values –

回答

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'); 
+0

你好,謝謝你的回答,但在我的情況下,我需要這種價值爲不同的ta通過單個查詢來查詢。所以我不能決定列號或名稱。我將需要像遍歷列一樣的東西。 – compyutech

+0

請舉個例子。您正在尋找一個查詢來獲得任何給定表中每個記錄的所有字段的逗號分隔值的字符串表示形式?一個pl/pgsql函數似乎是當時的方式。 – Eggplant

1

關於直接在SELECT查詢上執行此操作的問題是,它會導致一些問題,主體是關於轉義。例如,如果你在一個記錄字符串中有一個逗號,你會如何處理?

當然,您可以解析字符串並將其轉義,但最常見的(推薦)方法是使用衆所周知的CSV格式。和PostgreSQL已經給你一個結果使用COPY command這樣,所以你不必重新發明輪子:

COPY (SELECT * FROM master_table WHERE id = 1) TO stdout WITH CSV; 
0

如果你想了解從psql的殼CSV格式的數據,只需修改一些psql的選項 你未對齊和對準的輸出模式

  • 之間切換\ F [STRING]:可以使用以下命令

    • \一個做顯示或設置字段分隔符不對齊的查詢輸出

    也可以在下面的命令

    • 通過查詢結果保存\ 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=# 
    
  • 相關問題