gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:31:38 25 4
gpt4 key购买 nike

我有一个包含长文本列的表格。我希望能够选择所有列但限制文本列而不需要编写每一列。

select * from resources;

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

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

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

最佳答案

我不知道 psql 的内置选项是什么。
您可以使用类似 @Drazen suggested 的函数来实现您的目标- 只是简单得多:

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 Fiddle.

注意事项

  • 适用于包含任何数据类型的列的任何表。

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

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

  • 该函数返回所有列的原始列名和数据类型。在馈送到 left() 之前,我将短列转换为 text,它返回 text,所以 text 列不会不需要另一个 Actor 。所有其他缩短的类型都需要转换回原始类型。 有些类型会在您截断时中断!所以这并不适用于所有类型。

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

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

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

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

具有更多解释和链接的相关答案:

pgAdmin

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

enter image description here

关于postgresql - 在 postgres psql select 语句中默认截断显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33875295/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com