PostgreSQL行到字符串

PostgreSQL行到字符串,postgresql,types,casting,null,row,Postgresql,Types,Casting,Null,Row,我从下面这样的查询中得到了一个结果,它没有固定的列数 ID COL1 COL2 COL3 COL4 ------------------------------------- 1 VAL11 VAL12 VAL13 VAL14 2 VAL21 VAL22 VAL23 VAL24 现在我希望结果是这样的 RESULT ----------------------------------------------------- ID:1, COL1

我从下面这样的查询中得到了一个结果,它没有固定的列数

ID  COL1    COL2    COL3    COL4
-------------------------------------
1   VAL11   VAL12   VAL13   VAL14
2   VAL21   VAL22   VAL23   VAL24
现在我希望结果是这样的

RESULT
-----------------------------------------------------
ID:1, COL1:VAL11, COL2:VAL12, COL3:VAL13, COL4:VAL14
ID:2, COL1:VAL21, COL2:VAL22, COL3:VAL23, COL4:VAL24

请提供帮助。

快速而肮脏的方式,但不包含列名并包含空值:

SELECT tbl::text
FROM   tbl;
缓慢而可靠的方法:

SELECT array_to_string(ARRAY[
          'ID:'   || id
         ,'COL1:' || col1
         ,'COL2:' || col2
        ], ', ')  AS result
FROM    tbl;
如果列包含空值,则结果中将缺少该值。我不只是串联,因为空值将使整行为空。 确保逗号仅在需要时插入

PostgreSQL 9.1引入了与MySQL中类似的新功能,我们可以进一步简化:

SELECT concat_ws(', '
          'ID:'   || id
         ,'COL1:' || col1
         ,'COL2:' || col2
        ) AS result
FROM    tbl;
选择 “ID:”|| coalesceid::text, ||“,”| |“COL1:”| | coalescecol1::text, ||“,”| |“COL2:”| | coalescecol2::text, 来自tbl; 如果有很多列,可以使用此SQL为您生成第一个:


第二种方法不是简单地将值串联起来,而不是首先创建一个数组,然后将该数组转换回一个字符串吗?@a_horse_with_no_name:那么你将如何处理空值呢?每一列都需要一个CASE语句,并且很难使逗号匹配。我去过那里,做过那件事。这样容易多了。如果没有空值,您是对的。使用coalesce而不是CASE语句来处理空值不是更容易吗?@vyegorov:coalesce或CASE是两个相同目的的工具。逗号的位置将是一个棘手的部分。所有这些都是可能的,但比必要的更复杂。尝试为具有多个列的行提供查询…如果将占位符替换为空列,则会变得更简单。棘手的部分是修剪空列。假设,第一列为NULL,或者第一列和第二列。。。从第9.1页开始,您可以使用concat_ws进一步简化。
SELECT E'SELECT \n'||string_agg(trim(stmt), E' \n')||E'\n  FROM tbl;'
  FROM (SELECT
    CASE WHEN a.attnum > 1 THEN $$||', '||$$ ELSE '' END ||
    $$'$$||upper(a.attname)||$$:'||coalesce($$||quote_ident(a.attname)||
    $$::text, '<null>')$$ AS stmt
  FROM pg_attribute a, pg_class t
 WHERE t.relkind='r' AND t.relname = 'tbl' AND a.attrelid = t.oid
   AND NOT a.attisdropped AND a.attnum > 0) AS s;