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 を使用して最初の 1 つを生成できます (多数の列がある場合)。

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