Nie ma możliwości z wbudowanymi opcjami psql, o których bym wiedział.
Możesz osiągnąć swój cel za pomocą funkcji takiej jak Zasugerowano @Drazen
- po prostu znacznie prostsze :
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;
Przykłady połączeń:
SELECT * FROM f_trunc_columns(NULL::my_table);
SELECT * FROM f_trunc_columns(NULL::"MySchema"."My_funny_tbl", 11);
Notatki
-
Działa dla każdego tabela z kolumnami dowolnych typ danych.
-
To tworzy i wykonuje zapytanie w postaci:
SELECT "FoO_id", left(c_text, 11), left(c_vc, 11)::character varying FROM "FoO";
-
Skraca tylko kolumny wybranych typów danych, a inne pozostawia w spokoju. Uwzględniłem podstawowe typy znaków:
bpchar
to wewnętrzna nazwacharacter
i wszystkie warianty.varchar
to wewnętrzna nazwacharacter varying
i wszystkie warianty.
Dostosuj się do swoich potrzeb. -
Funkcja zwraca oryginalne nazwy kolumn i typy danych dla wszystkich kolumn. Przesyłam krótkie kolumny do
text
przed podaniem doleft()
, który zwracatext
, więctext
kolumny nie potrzebują kolejnej obsady. Wszystkie inne skrócone typy wymagają odtworzenia z powrotem do oryginalnego typu. Niektóre typy psują się, jeśli je skrócisz! Więc to nie działa dla wszystkich typów. -
Możesz dołączyć
LIMIT n
do wywołania funkcji, ale funkcję można łatwo rozszerzyć za pomocą wbudowanegoLIMIT
- czyli dużo bardziej wydajne dla dużych tabel, ponieważ zapytanie wewnątrz funkcji plpgsql jest planowane niezależnie. -
Wydajność nie jest dużo gorszy niż zwykły
SELECT * FROM tbl
- z wyjątkiem wspomnianegoLIMIT
case lub inne przypadki, w których zagnieżdżasz funkcję. Funkcje PL/pgSQL zwracające zestaw zazwyczaj najlepiej nie zagnieżdżać: -
Wbudowałem domyślnie max. długość 25 znaków, przekaż niestandardową długość jako drugi parametr lub dostosuj wartość domyślną w nagłówku funkcji do swoich potrzeb.
-
Ta funkcja jest bezpieczna przed możliwymi atakami wstrzyknięcia SQL za pomocą złośliwie spreparowanych identyfikatorów.
Powiązane odpowiedzi z dodatkowymi wyjaśnieniami i linkami:
- Zamień puste ciągi na wartości null
- Refaktoryzacja funkcji PL/pgSQL w celu zwrócenia wyników różnych zapytań SELECT
- Nazwa tabeli jako Parametr funkcji PostgreSQL
- Przesyłanie typu danych Postgres
- Zapytać o szczegóły schematu tabeli w PostgreSQL?
- Jak sprawdzić, czy tabela istnieje w danym schemacie
pgAdministrator
... ma funkcję, o którą prosisz, btw (dla wszystkich kolumn):