据我所知,没有办法使用 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 函数通常最好不要嵌套:
我内置了默认的最大值。长度为 25 个字符,传递自定义长度作为第二个参数,或根据您的需要调整函数头中的默认长度。
此函数可以安全地抵御可能通过恶意制作的标识符进行的 SQL 注入攻击。
相关答案以及更多解释和链接:
- 将空字符串替换为 null 值
- 重构 PL/pgSQL 函数以返回各种 SELECT 查询的输出
- 表名作为 PostgreSQL 函数参数
- Postgres 数据类型转换
- 查询 PostgreSQL 中表的架构详细信息?
- 如何检查给定模式中是否存在表
pgAdmin
...具有您要求的功能,顺便说一句(对于所有列):