20

在终端中使用 SQLite 时,这纯粹是为了吸引眼球,但是有没有办法用标题格式化列宽,以便适当调整每个标题的大小(并且独立于其他列)?换句话说,这是输出

.width auto

对于一个简单的表

Id          Name        Price     
----------  ----------  ----------
1           Audi        52642     
2           Mercedes    57127     
3           Skoda       9000      
4           Volvo       29000     
5           Bentley     350000    
6           Citroen     21000     
7           Hummer      41400     
8           Volkswagen  21600 

它符合我的预期。它调整每一列的大小,以便可以显示任何一列中最长的项目。但是,我想自动格式化输出,使每列的宽度足以容纳仅其列中最长的项目。换句话说,我不想输入

.width 2 10 5

事后得到这个输出

Id  Name        Price
--  ----------  -----
1   Audi        52642
2   Mercedes    57127
3   Skoda       9000 
4   Volvo       29000
5   Bentley     35000
6   Citroen     21000
7   Hummer      41400
8   Volkswagen  21600

我可以做些什么来正确地自动调整列大小吗?

4

8 回答 8

6

SQLite的文档中:

如果将列的宽度指定为 0,则列宽会自动调整为三个数字中的最大值:10、表头宽度和第一行数据的宽度。这使得列宽可以自我调整。每列的默认宽度设置是这个自动调整的 0 值。

于 2017-09-14T00:09:35.617 回答
5

对于“人类可读”输出,您可以使用column模式并打开header输出。这将为您提供类似于sqlplus示例中的输出的内容:

sqlite> select * from foo;
234|kshitiz|dba.se

sqlite> .mode column
sqlite> select * from foo;
234         kshitiz     dba.se

sqlite> .headers on
sqlite> select * from foo;
bar         baz         baf
----------  ----------  ----------
234         kshitiz     dba.se
于 2016-10-10T05:05:30.297 回答
4

sqlite3工具没有这样的功能。

您必须手动计算列宽 ( SELECT max(length(col1)) ...)。

于 2013-09-19T19:47:22.453 回答
4

替代 .width,使用一个用空格填充的别名。

优点是您在查询中只为那些需要额外宽度的列动态调整宽度,而其余列继续使用自动调整宽度。

所有列都将使用基于 sqlite 文档宽度规则的自动调整宽度:

如果将列宽指定为 0,则列宽会自动调整为三个数字中的最大值:10、表头宽度和第一行数据的宽度。这使得列宽可以自我调整。每列的默认宽度设置是这个自动调整的 0 值。

假设您的表“my_table”具有“名称”、“年龄”和“地址”列。您有兴趣展示:

  1. “名称”:前 20 个字符
  2. “年龄”:自动调整
  3. “地址”:前 30 个字符

您的查询将是:

.mode columns
.headers on

CREATE TABLE my_table (name TEXT, age INTEGER, address TEXT);

INSERT INTO my_table VALUES ("short name",
22, "my house");

INSERT INTO my_table VALUES ("my name is very long",
22, "i live in my house somewhere in the planet Earth");

SELECT name AS "name                ",
       age,
       address AS "address                       "
FROM my_table;

你的输出:

name                  age         address                       
--------------------  ----------  ------------------------------
short name            22          my house                      
my name is very long  22          i live in my house somewhere i
于 2020-05-11T04:29:50.850 回答
3

您可以使用简单的 awk 脚本,例如:

sqlite3 -batch -list db "select ..." awk -F'|' '{printf "%3s %4s %s\n", $1, $2, $3}'

很简单。也比 sqlite 的列模式更容易、更灵活。

于 2017-05-02T01:14:44.020 回答
3

您可以使用rlwrapand自动执行此操作column

$ rlwrap -a -N -c -z pipeto sqlite3 -header foo.db
> select * from cars; | column -n -t -s '|'

有关更多详细信息,请参阅我对sqlite3 的回答是 chopping/cutting/truncating my text columns 。

于 2015-11-11T16:09:08.557 回答
0

我知道这个问题有点老了,但是对于将来的问题,您可以指定所有长度不同的输出列的宽度。例如:

sqlite > .width 5 25 15
于 2021-03-02T18:24:42.017 回答
-1

正确答案是: sqlite> .mode column sqlite> .width 2 10 5

搏一搏

于 2021-04-17T13:15:14.480 回答