3. 格式化输出
xSQL 交互命令的输出可以通过输出命令重定向到文件或被抑制。
output console|null|<filename>
此命令可在控制台、空设备(抑制输出)和磁盘文件之间切换 SQL 引擎的输出。例如,以下命令将把后续命令和/或 SQL 语句的输出定向到文件 S.csv,然后将输出重定向到控制台:
output S.csv
select ...
output console
格式化查询输出
正如在步骤 2 中所提到的,选择语句的输出可以进行格式化以实现更具可读性的显示。实际上,有多种方式来设置输出的样式以及格式化特定类型的输出字段。
输出样式
默认情况下,xSQL 会按照之前示例中所看到的那样显示查询结果。这被称为文本格式。但输出也可以以 HTML、XML、CSV 或 LIST 格式显示。
文本TEXT
例如,运行 account.sql 脚本,然后运行以下选择:
XSQL>script account.sql
XSQL>select * from Account;
userid name lastlog
------------------------------------------------------------------------------
101 Dennis Hamer 01/23/2015 14:15:03
102 Edith Jackson 02/12/2015 19:30:16
103 Eric Harmon 02/14/2015 09:34:47
CSV
要将上述查询结果切换为“CSV”格式,我们使用“format”命令,其语法为:
format CSV [delimiter ‘<C>’ [header on|off] ]
例如,使用管道符“|”来分隔字段:
XSQL>format CSV delimiter '|'
XSQL>select * from Account;
userid|name|lastlog|volume
101|Dennis Hamer|01/23/2015 14:15:03|12.775843
102|Edith Jackson|02/12/2015 19:30:16|420.885432
103|Eric Harmon|02/14/2015 09:34:47|0.348857
并且删除标题行:
XSQL>format CSV delimiter '|' header off
XSQL>select * from Account;
101|Dennis Hamer|01/23/2015 14:15:03|12.775843
102|Edith Jackson|02/12/2015 19:30:16|420.885432
103|Eric Harmon|02/14/2015 09:34:47|0.348857
列表LIST
“LIST”选项将每个字段显示在单独的一行上,这对于长字段值(即数组或序列)来说可能很方便:
XSQL>format LIST
XSQL>select * from Account;
userid: 101
name: Dennis Hamer
lastlog: 01/23/2015 14:15:03
volume: 12.775843
-------------------------------------------------------
userid: 102
name: Edith Jackson
lastlog: 02/12/2015 19:30:16
volume: 420.885432
-------------------------------------------------------
userid: 103
name: Eric Harmon
lastlog: 02/14/2015 09:34:47
volume: 0.348857
-------------------------------------------------------
Selected records: 3
HTML
该 HTML 选项将输出表示为 HTML 表格:
XSQL>format HTML
XSQL>select * from Account;
<table border>
<tr><th>userid</th><th>name</th><th>lastlog</th><th>volume</th></tr>
<tr><td>101</td><td>Dennis Hamer</td><td>01/23/2015 14:15:03</td><td>12.775843</td></tr>
<tr><td>102</td><td>Edith Jackson</td><td>02/12/2015 19:30:16</td><td>420.885432</td></tr>
<tr><td>103</td><td>Eric Harmon</td><td>02/14/2015 09:34:47</td><td>0.348857</td></tr>
</table>
XML
XSQL>format XML
XSQL>select * from Account;
<Account>
<userid>101</userid>
<name>Dennis Hamer</name>
<lastlog>01/23/2015 14:15:03</lastlog>
<volume>12.775843</volume>
</ Account >
< Account >
<userid>102</userid>
<name>Edith Jackson</name>
<lastlog>02/12/2015 19:30:16</lastlog>
<volume>420.885432</volume>
</ Account >
< Account >
<userid>103</userid>
<name>Eric Harmon</name>
<lastlog>02/14/2015 09:34:47</lastlog>
<volume>0.348857</volume>
</ Account >
数字格式
通常,人们希望在查询输出中重新格式化数字数据。这可以通过以下格式命令轻松实现:numformat、dtformat、strformat、seqformat 和 arrayformat。
numformat
numformat 命令使用标准的 C printf() 类型的格式字符串;例如:
XSQL>numformat "%6.2f"
在之前的 top_close.sql 查询中,使用 numformat 将收盘价的值四舍五入到美分,我们将按如下方式指定数字格式:
XSQL>script top_close.sql
symbol top_index top_Close volume
------------------------------------------------------------------------------
SYM0 {34} { 97.24} {732}
SYM1 {57} { 96.53} {406}
SYM2 {2} { 94.87} {765}
SYM3 {65} { 98.74} {953}
SYM4 {62} { 93.25} {312}
SYM5 {76} { 92.52} {829}
SYM6 {59} { 94.83} {761}
SYM7 {98} { 99.32} {583}
SYM8 {37} { 97.59} {593}
SYM9 {81} { 93.78} {257}
Selected records: 10
(请注意,格式规范字符串是适用于 C 的 printf() 函数的字符串,允许的选项取决于开发系统上安装的 glibc 库的版本。)
日期/时间格式
默认情况下,xSQL 将按照主机计算机当前区域设置显示日期字段,例如 lastlog。例如:
XSQL>select lastlog from Account;
lastlog
------------------------------------------------------------------------------
01/23/2015 14:15:03
02/12/2015 19:30:16
02/14/2015 09:34:47
但是我们可以使用命令“dtformat”重新格式化输出,以国际日期格式显示日期,并以 12 小时制显示时间,如下所示:
XSQL>dtformat "%d/%m/%Y %I:%M:%S %p"
XSQL>select * from Account;
userid name lastlog
------------------------------------------------------------------------------
101 Dennis Hamer 23/01/2015 02:15:03 PM
102 Edith Jackson 12/02/2015 07:30:16 PM
103 Eric Harmon 14/02/2015 09:34:47 AM
(请注意,格式规范字符串是适用于 C 语言的 strftime() 函数的字符串,并且允许的选项取决于开发系统上安装的 glibc 库的版本。)要将输出恢复为当前的区域设置:
XSQL>dtformat "%c"
字符串格式
我们可能希望将查询输出中的字符串长度限制为固定宽度。例如:
XSQL>script strings.sql
XSQL>select * from A;
strlen s
------------------------------------------------------------------------------
33 A string containing 33 characters
14 A short string
然后将输出的宽度限制为如下的 20 个字符:
XSQL>strformat width=20
XSQL>select * from A;
strlen s
------------------------------------------------------------------------------
33 A string containing>
14 A short string
请注意,第二个查询中的字段被截断为长度 20,其中“>”字符表示截断。若要返回字符串字段的完整宽度,请按如下方式指定零宽度:
XSQL> strformat width=0
也可以对字符串使用索引运算符“[from:to]”来提取一定范围的字符。例如:
XSQL>select s[1:7] from A;
#1
------------------------------------------------------------------------------
A strin
A short
但在大多数情况下,最好使用 substr() 函数(在步骤 6 中演示)从字符串字段中提取子字符串。
序列数据
类型的序列格式字段在查询输出中可能会显得笨拙。默认情况下,xSQL 会显示序列的前 5 个和后 5 个元素,中间用类似于“…<N 个元素>…”的表达式。例如,如果我们使用命令启动 xSQL
xSQL –i –f IBM-q1-2013.sql
该脚本创建了“QuoteIBM”表,并使用 2013 年的一些历史数据对其进行初始化。“high”序列字段可以如下显示:
XSQL>numformat "%6.2f"
XSQL>select symbol, high from Quote;
symbol high
------------------------------------------------------------------------------
IBM {196.35, 196.29, 194.46, 193.78, 193.30, ...<50 element(s)>..., 213.17, 212.81, 212.50, 212.16, 213.44}
使用命令“seqformat”,我们可以限制要显示的首尾元素的数量。对于元素的显示方式,有两个选项。短格式按上述顺序显示元素;长格式显示每个元素的索引及其值。例如,我们可以将序列输出重新格式化为如下:
XSQL>seqformat short 3 3
XSQL> select symbol, high from Quote;
symbol high
------------------------------------------------------------------------------
IBM {196.35, 196.29, 194.46, ...<54 element(s)>..., 212.5, 212.16, 213.44}
XSQL>seqformat long 2 1
XSQL>select symbol, high from Quote;
symbol high
------------------------------------------------------------------------------
IBM {0:196.35, 1:196.29, ...<57 element(s)>..., 59:213.44}
XSQL>seqformat short 3 0
XSQL>select symbol, high from QuoteIBM;
symbol high
------------------------------------------------------------------------------
IBM {196.35, 196.29, 194.46, ...<57 element(s)>...}
XSQL>seqformat short 0 0
XSQL>select symbol, high from QuoteIBM;
symbol high
------------------------------------------------------------------------------
IBM {...<60 element(s)>...}
使用索引运算符 [from:to] 处理序列来提取一系列值也是可行的。例如:
XSQL>select symbol, high[1:3] from Quote;
symbol #2
------------------------------------------------------------------------------
IBM {196.29, 194.46, 193.78}
XSQL>select symbol, high[57:] from Quote;
#1
------------------------------------------------------------------------------
IBM {212.50, 212.16, 213.44}
数组格式
与序列的 seqformat 类似,通过命令 arrayformat,我们可以限制数组类型字段要显示的开头和结尾元素的数量。例如,我们可以创建并初始化一个表 A,并限制数组字段的输出,如下所示:
XSQL>create table B (id integer primary key, arr array(char(10)));
XSQL>insert into B values (1, ['zero', 'one', 'two', 'three', 'four', 'five',
'six', 'seven', 'eight', 'nine', 'ten']);
XSQL>select * from B;
id arr
------------------------------------------------------------------------------
1 [zero, one, two, three, four, ...<1 element(s)>..., six, seven, eight, nine, ten]
XSQL>arrayformat long 3 3
XSQL>select * from B;
id arr
------------------------------------------------------------------------------
1 [0:zero, 1:one, 2:two, ...<5 element(s)>..., 8:eight, 9:nine, 10:ten]
XSQL>arrayformat short
XSQL>select * from B;
id arr
------------------------------------------------------------------------------
1 [zero, one, two, three, four, five, six, seven, eight, nine, ten]
既然我们已经了解了如何定制输出格式,那么探索 xSQL 的一些强大功能是很有用的,比如分布式数据库分片(第 4 步)、使用配置文件(第 5 步)等等。