如何根据“深度”缩进查询输出?

时间:2013-03-15 21:49:11

标签: sql postgresql

想象一下这样的表:

create table test (depth integer, name text);

添加一些行:

insert into test (depth, name)
values (0, "no indent"), (1, "single indent"), (2, "double indent");

现在,根据depth参数创建输出,如下所示:

no indent
    single indent
        double indent

这种情况下的缩进是4个空格(但可以更改为任何有趣的缩进,如制表符)。

我的直觉想要做这样的事情:

select '    ' * depth || name from test order by depth;

然而,这在Postgres中爆发了。像这样的字符串乘法在Python中按预期工作。但是,我不熟悉Postgres中的等效操作。其他数据库实现也很有趣。

2 个答案:

答案 0 :(得分:2)

使用lpad()

select lpad(name, (4 * depth) + length(name), ' ')
from test 
order by depth;

repeat()加上连接:

select repeat('_', 4 * depth) || name
from test 
order by depth;

http://www.postgresql.org/docs/current/static/functions-string.html

答案 1 :(得分:1)

我无法访问Postgresql,但在SQL Fiddle前导空格会被自动抑制。

我将空格改为下划线并且有效。

我的代码(基于REPEAT):

select REPEAT(REPEAT('_', 4), depth) || name as "Column" from test order by depth;

使用您的数据链接到SQL Fiddle:http://sqlfiddle.com/#!1/96f11/4