postgres psql select 语句中默认截断显示

2023-11-26

我有一个带有长文本列的表格。我希望能够选择所有列,但限制文本列,而无需编写每一列。

select * from resources;

生成的输出太长,无法在 psql 中正确显示。我可以通过使用来显示一些东西substr() or left()在长列上,但是我需要指定每一列。

select id, left(data, 50), file_format_version, ... from resources;

有没有一种方法可以让 psql 在查询第一个时默认截断长列select * from resources?


据我所知,没有办法使用 psql 的内置选项。
您可以通过类似的功能来实现您的目标@Drazen建议 - just 简单得多:

CREATE OR REPLACE FUNCTION f_trunc_columns(_tbl anyelement, _len int = 25)
  RETURNS SETOF anyelement AS
$func$
DECLARE
   _typ  CONSTANT regtype[] := '{bpchar, varchar}';  -- types to shorten
BEGIN
   RETURN QUERY EXECUTE (
   SELECT format('SELECT %s FROM %s'
               , string_agg(CASE WHEN a.atttypid = 'text'::regtype  -- simple case text
                              THEN format('left(%I, %s)', a.attname, _len)
                            WHEN a.atttypid = ANY(_typ)             -- other short types
                              THEN format('left(%I::text, %s)::%s'
                                 , a.attname, _len, format_type(a.atttypid, a.atttypmod))
                            ELSE quote_ident(a.attname) END         -- rest
                          , ', ' ORDER BY a.attnum)
               , pg_typeof(_tbl))
   FROM   pg_attribute a
   WHERE  a.attrelid = pg_typeof(_tbl)::text::regclass
   AND    NOT a.attisdropped  -- no dropped (dead) columns
   AND    a.attnum > 0        -- no system columns
   );
END
$func$  LANGUAGE plpgsql;

调用示例:

SELECT * FROM f_trunc_columns(NULL::my_table);
SELECT * FROM f_trunc_columns(NULL::"MySchema"."My_funny_tbl", 11);

SQL 小提琴。

Notes

  • 效劳于any包含以下列的表any数据类型。

  • 这将构建并执行以下形式的查询:

    SELECT "FoO_id", left(c_text, 11), left(c_vc, 11)::character varying
    FROM   "FoO";
    
  • 它仅缩短所选数据类型的列,而不会影响其他数据类型。我包括了基本的字符类型:
    bpchar是内部名称character和所有变体。
    varchar是内部名称character varying和所有变体。
    扩展到您的需求。

  • 该函数返回所有列的原始列名和数据类型。我将短柱投射到text在喂食之前left(),返回text, so text列不需要另一个演员。所有其他缩短的类型都需要转换回原始类型。如果截断某些类型就会中断!所以这并不适用于所有类型。

  • 您可以附加LIMIT n到函数调用,但可以使用内置函数轻松扩展该函数LIMIT- 这是much对于大表更有效,因为 plpgsql 函数内的查询是独立规划的。

  • 表现并不比普通的差多少SELECT * FROM tbl- 除了所说的LIMIT情况或嵌套函数的其他情况。返回集合的 PL/pgSQL 函数通常最好不要嵌套:

    • PostgreSQL 存储过程性能
  • 我内置了默认的最大值。长度为 25 个字符,传递自定义长度作为第二个参数,或根据您的需要调整函数头中的默认长度。

  • 此函数可以安全地抵御可能通过恶意制作的标识符进行的 SQL 注入攻击。

相关答案以及更多解释和链接:

  • 将空字符串替换为 null 值
  • 重构 PL/pgSQL 函数以返回各种 SELECT 查询的输出
  • 表名作为 PostgreSQL 函数参数
  • Postgres 数据类型转换
  • 查询 PostgreSQL 中表的架构详细信息?
  • 如何检查给定模式中是否存在表

pgAdmin

...具有您要求的功能,顺便说一句(对于所有列):

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

postgres psql select 语句中默认截断显示 的相关文章

随机推荐