我想编写一个查询,返回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
答案 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
行都有一个“空白”行,按初始查询排序。结果集在现有行之间只有“空白”行 - 两端没有“空白”行。