3

我有如下查询的结果,它没有固定数量的列

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

请帮忙。

4

2 回答 2

3

快速而肮脏的方式,但没有列名并包括 NULL 值:

SELECT tbl::text
FROM   tbl;

缓慢而可靠的方式:

SELECT array_to_string(ARRAY[
          'ID:'   || id
         ,'COL1:' || col1
         ,'COL2:' || col2
        ], ', ')  AS result
FROM    tbl;

如果一列包含一个NULL值,它将在结果中丢失。我不只是连接,因为NULL值会使整行无效。
array_to_string()确保仅在需要的地方插入逗号。


PostgreSQL 9.1引入了新函数concat_ws()(很像 MySQL 中的函数),我们可以进一步简化:

SELECT concat_ws(', '
          'ID:'   || id
         ,'COL1:' || col1
         ,'COL2:' || col2
        ) AS result
FROM    tbl;
于 2012-04-10T15:36:10.387 回答
1
SELECT
            'ID:'  ||coalesce(id::text,   '<null>')
    ||', '||'COL1:'||coalesce(col1::text, '<null>')
    ||', '||'COL2:'||coalesce(col2::text, '<null>')
FROM tbl;

您可以使用此 SQL 为您生成第一个(如果有很多列):

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;
于 2012-04-10T19:19:31.727 回答