Няма начин с вградени опции на psql, за които да знам.
Можете да постигнете целта си с функция като @Drazen предложи
- просто много по-просто :
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);
Бележки
-
Работи за всеки таблица с колони от всеки тип данни.
-
Това изгражда и изпълнява заявка от формата:
SELECT "FoO_id", left(c_text, 11), left(c_vc, 11)::character varying FROM "FoO";
-
Той съкращава само колони от избрани типове данни и оставя други на мира. Включих основни типове символи:
bpchar
е вътрешното име заcharacter
и всички варианти.varchar
е вътрешното име заcharacter varying
и всички варианти.
Разширете според вашите нужди. -
Функцията връща оригинални имена на колони и типове данни за всички колони. Прехвърлям къси колони към
text
преди подаване къмleft()
, който връщаtext
, така чеtext
колоните не се нуждаят от друг кастинг. Всички други съкратени типове се нуждаят от връщане към оригиналния тип. Някои типове се повреждат, ако съкратите! Така че това не работи за всички типове. -
Можете да добавите
LIMIT n
към извикването на функцията, но функцията може лесно да бъде разширена с вграденLIMIT
- което е много по-ефективен за големи таблици, тъй като заявката във функцията plpgsql се планира независимо. -
Ефективност не е много по-лош от обикновен
SELECT * FROM tbl
- с изключение на споменатияLIMIT
случай или други случаи, в които влагате функцията. PL/pgSQL функциите, връщащи множество, обикновено е най-добре да не са вложени: -
Вградих макс. дължина от 25 знака, подайте персонализирана дължина като 2-ри параметър или адаптирайте стойността по подразбиране в заглавката на функцията към вашите нужди.
-
Тази функция е безопасна срещу възможни атаки чрез SQL инжектиране чрез злонамерено създадени идентификатори.
Свързани отговори с повече обяснения и връзки:
- Замяна на празни низове с нулеви стойности
- Рефакторинг на PL/pgSQL функция, за да върне резултата от различни SELECT заявки
- Името на таблицата като Параметър на функцията PostgreSQL
- Предаване на типа данни на Postgres
- Запитване за подробности за схемата на таблица в PostgreSQL?
- Как да проверя дали таблица съществува в дадена схема
pgAdmin
... между другото има функцията, която искате (за всички колони):