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

对此的两个关键部分 - 假设您绝对必须将其放入 SQL 查询而不是一些更广泛的后处理 - 是 1)以您喜欢的方式选择格式化为字符串的适当列,以及 2)一次选择所有结果而不是运行多个 SQL 查询。

第一部分需要将您的数据转换为字符串类型,并将它们与适当的分隔符连接在一起。在 PostgreSQL(和 SQL 标准,但不是所有其他 DBMS)中,字符串连接运算符是||. 我也喜欢类型转换的非标准 PostgreSQL 语法column::type,尽管Cast(column as type)它更便于移植。

对于第二部分,您需要 SQLUNION运算符,它将两个具有相同数量和类型的列的结果集组合在一起。有一些需要记住的细节 - aUNION将删除重复的行,这可以通过UNION ALL;来避免。并且您不能直接ORDER BY在合并的两个查询中使用。

这是一个示例查询,它似乎可以提供您想要的内容。请注意,尽管在简单示例中这似乎正确排序,但我认为它应该严格ORDER BY在最后有一个,毕竟所有结果都已联合在一起。

此处的交互式演示: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 回答