如何在psql中设置统一的数值显示格式?
在psql中批量设置数值列的显示格式
我完全懂你的痛点——当查询里堆着一堆数值列时,挨个写to_char()或者round()实在太繁琐了,谁不想有个会话级的设置一键搞定呢?
首先得明确:psql目前并没有像你假想的\pset numeric '9.9EEEEE'这类直接统一设置数值显示格式的参数,我翻官方文档时也确认过这一点。不过别担心,有几个实用方法能帮你减少重复代码:
方法1:用psql宏简化重复代码
psql支持自定义宏,你可以把格式化逻辑封装成一个宏,之后查询时直接调用就行:
-- 定义宏:第一个%s是列名,第二个%s是别名(保持列名不变) \set fmt_num 'to_char(%s, ''9.9EEEEE'') as %s'
之后查询的时候,就可以这样用:
select :fmt_num(bar, bar) from (values (123456789), (0.123456789), (0.000000123456789)) table_foo (bar);
如果有多个数值列,只需要重复:fmt_num(col_name, col_name)就行,比如:
select id, :fmt_num(col1, col1), :fmt_num(col2, col2), varchar_col from your_table;
比手动写to_char()清爽太多。
方法2:创建视图封装格式化逻辑
如果经常需要查询某张表的格式化结果,不如直接创建一个视图,把所有数值列的格式化逻辑提前写好:
create view formatted_table_foo as select to_char(bar, '9.9EEEEE') as bar, -- 其他数值列同理处理,非数值列直接保留 other_varchar_col from table_foo;
之后每次查询直接调用视图就行:
select * from formatted_table_foo;
这个方法适合长期固定的查询需求,一劳永逸。
方法3:自定义域(进阶方案)
如果你的业务场景中,某些数值类型本来就应该用科学计数法显示,可以自定义一个域(Domain),并绑定对应的输出函数:
-- 创建自定义域 create domain sci_float as double precision; -- 创建输出函数,指定显示格式 create or replace function sci_float_out(sci_float) returns text as $$ begin return to_char($1, '9.9EEEEE'); end; $$ language plpgsql immutable; -- 把域的输出函数改成我们自定义的 alter domain sci_float set output function sci_float_out(sci_float);
之后如果你的表列用sci_float类型,查询时就会自动以科学计数法显示,不需要额外处理。不过这个方法需要你能修改表结构,适合新表或者可以迁移的场景。
补充说明
虽然没有直接的会话级参数,但上面的方法都能帮你避免重复写格式化函数。如果只是临时查询,方法1最方便;如果是长期需求,方法2或3更合适。
内容的提问来源于stack exchange,提问作者Timur Shtatland
相关产品推荐
相关产品推荐

