有目的地使查询定期返回空白条目

时间:2011-10-21 21:41:44

标签: sql postgresql formatting

我想编写一个查询,返回3个结果,然后是空白结果,然后是接下来的3个结果,依此类推。因此,如果我的数据库有这些数据:

CREATE TABLE table (a integer, b integer, c integer, d integer);

INSERT INTO table (a,b,c,d) 
VALUES (1,2,3,4),
       (5,6,7,8),
       (9,10,11,12),
       (13,14,15,16),
       (17,18,19,20),
       (21,22,23,24),
       (25,26,37,28);

我希望我的查询返回此

1,2,3,4
5,6,7,8
9,10,11,12
 ,  ,  , 
13,14,15,16
17,18,19,20
21,22,23,24
  ,  ,  ,
25,26,27,28

我需要这个才能为我选择的任意多个条目工作,有三个像这样组合在一起。

我正在运行postgresql 8.3

3 个答案:

答案 0 :(得分:3)

简而言之,不,没有一种简单的方法可以做到这一点,通常,你不应该尝试。数据库关注的是您的数据实际是什么,而不是它将如何显示。期望数据库返回“虚拟”或“额外”数据,以便某些下游进程产生所需的输出,这不是一个适当的责任范围。生成脚本需要这样做。

由于你无法改变你的下游流程,你可以(阅读时有很大程度的怀疑和蔑视)添加如下内容:

Select Top 3
  a, b, c, d
From 
  table
Union Select Top 1
  '', '', '', ''
From 
  table
Union Select Top 3 Skip 3
  a, b, c, d
From
  table

请,实际上不要尝试这样做。

答案 1 :(得分:3)

这应该在PostgreSQL 8.3

中完美无缺地工作
SELECT a, b, c, d
FROM  (
    SELECT rn, 0 AS rk, (x[rn]).*
    FROM  (
        SELECT x, generate_series(1, array_upper(x, 1)) AS rn
        FROM  (SELECT ARRAY(SELECT tbl FROM tbl) AS x) x
    ) y

    UNION  ALL
    SELECT generate_series(3, (SELECT count(*) FROM tbl), 3), 1, (NULL::tbl).*
    ORDER  BY rn, rk
) z

重点

  • 适用于选择tbl
  • 的所有列的查询
  • 适用于任何表。
  • 要选择任意列,您必须在第二个查询中用(NULL::tbl).*替换匹配数量的NULL列。
  • 假设NULL值适用于“空白”行。
  • 如果没有,您必须将列添加到第一个text,并在第二个SELECT中替换'' NULL
  • 使用非常大的表格查询会很慢。

如果必须这样做,我会编写一个 plpgsql函数,循环遍历结果并插入空白行。但是你提到你没有直接访问db ...

答案 2 :(得分:2)

你可以这样做(至少在DB2上 - 你的PostgreSQL版本似乎没有相同的功能)。 不需要循环,尽管有一些诡计...... 请注意,虽然此有效,但 最好更改您的显示代码。

语句需要CTE(虽然可以重写以使用其他表引用)和OLAP函数(我猜测你可以将它重新写入count()以前的行中子查询,但......)。

WITH dataList (rowNum, dataColumn) as (SELECT CAST(CAST(:interval as REAL) / 
            (:interval - 1) * ROW_NUMBER() OVER(ORDER BY dataColumn) as INTEGER), 
                                              dataColumn
                                       FROM dataTable), 
     blankIncluder(rowNum, dataColumn) as (SELECT rowNum, dataColumn
                                           FROM dataList
                                           UNION ALL
                                           SELECT rowNum - 1, :blankDataColumn
                                           FROM dataList
                                           WHERE MOD(rowNum - 1, :interval) = 0
                                           AND rowNum > :interval)
SELECT *
FROM dataList
ORDER BY rowNum

这将生成数据表中这些元素的列表,每个interval行都有一个“空白”行,按初始查询排序。结果集在现有行之间只有“空白”行 - 两端没有“空白”行。