0

次の列を含むデータベースがあります。

key arg1 arg2 arg3 timebegin                     timeend
#1  a    b    c    1942-06-18 05:30:00+05:30     1945-06-18 05:30:00+05:30
#2  d    e    f    1940-10-09 05:53:20+05:53:20  1948-10-09 05:53:20+05:53:20
#3  w    x    y    

キーのタイプ arg1、arg2、arg3 は文字可変 (255) であり、timebegin と timeend のタイプはタイムゾーン付きのタイムスタンプです。

ここで、リレーショナル テーブルを以下の形式に変換します。

<1> <a> <b> <c>                              //key,arg1,arg2,agr3
<2> <d> <e> <f>
<3> <w> <x> <y>
<1> <a> <b> 1942-06-18 05:30:00+05:30       //With columns containing time attributes just key, arg1, arg2, timebegin are copied.
<1> <a> <b> 1945-06-18 05:30:00+05:30
<1> <d> <e> 1940-10-09 05:53:20+05:53:20
<1> <d> <e> 1948-10-09 05:53:20+05:53:20

SQL を使用してリレーショナル テーブルを上記の形式に変換することは可能ですか。リレーショナル テーブルの内容を csv 形式にダンプできることは知っています。しかし、リレーショナル テーブルの内容を上記の指定された形式に変換することも可能ですか。私のデータベースはpostgres 9.1です

**

*> 編集: ルール:

1. 最初にすべての行から key、arg1、arg2、arg3 がコピーされ、次に 2. NOT NULL timebegin および timeend 値を含むすべての行について: key,arg1,arg2,timebegin および key,arg1,arg2,timeend がコピーされます*

**

注: "<>" が配置されているかどうかは問題ではありません。

4

1 に答える 1

0

これに対する 2 つの重要な部分は、これを後処理ではなく SQL クエリにする必要があると仮定すると、1) 適切な列を選択して文字列にフォーマットし、2) すべての結果を一度に選択することです。複数の SQL クエリを実行するのではなく、

最初の部分では、データを文字列型にキャストし、それらを適切な区切り記号で連結する必要があります。PostgreSQL (および SQL 標準ですが、他のすべての DBMS ではありません) では、文字列連結演算子は||. また、型キャストの非標準の PostgreSQL 構文も気に入っています。column::typeただし、Cast(column as type)移植性は高くなります。

UNION2 番目の部分では、列の数とタイプが同じ 2 つの結果セットを結合する SQL 演算子が必要です。覚えておくと面倒な点がいくつかあります - aは重複行を削除しますが、これは;UNIONで回避できます。また、結合されている 2 つのクエリでUNION ALL直接使用することはできません。ORDER BY

これは、あなたが望むものを与えると思われるサンプルクエリです。ORDER BYこれは単純な例では正しくソートされているように見えますが、すべての結果が一緒に UNION された後、最後に厳密に があるべきだと思います。

インタラクティブなデモはこちら: http://sqlfiddle.com/#!1/7f754/5/0

Select string
From
(
  Select
    '<' || key::text || '> ' 
    || '<' || arg1 || '> '
    || '<' || arg2 || '> '
    || '<' || arg3 || '>' as string
  From
    Foo
  Order by key
) as x

Union All

Select string
From
(
  Select
    key,
    '<' || key::text || '> ' 
    || '<' || arg1 || '> '
    || '<' || arg2 || '> '
    || timebegin::text as string
  From
    Foo
  Where
    timebegin Is Not Null
    And
    timeend Is Not Null

  Union All

  Select
    key,
    '<' || key::text || '> ' 
    || '<' || arg1 || '> '
    || '<' || arg2 || '> '
    || timebegin::text as string
  From
    Foo
  Where
    timebegin Is Not Null
    And
    timeend Is Not Null

  Order by key
) as x
于 2013-05-19T22:38:57.043 に答える