Tidak ada cara dengan opsi psql bawaan yang akan saya ketahui.
Anda dapat mencapai tujuan Anda dengan fungsi seperti @Drazen disarankan
- lebih sederhana :
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;
Contoh panggilan:
SELECT * FROM f_trunc_columns(NULL::my_table);
SELECT * FROM f_trunc_columns(NULL::"MySchema"."My_funny_tbl", 11);
Catatan
-
Bekerja untuk apa saja tabel dengan kolom apa saja tipe data.
-
Ini membangun dan mengeksekusi kueri formulir:
SELECT "FoO_id", left(c_text, 11), left(c_vc, 11)::character varying FROM "FoO"; -
Ini hanya mempersingkat kolom dari tipe data yang dipilih dan membiarkan yang lain saja. Saya menyertakan tipe karakter dasar:
bpcharadalah nama internal untukcharacterdan semua varian.varcharadalah nama internal untukcharacter varyingdan semua varian.
Perluas sesuai kebutuhan Anda. -
Fungsi mengembalikan nama kolom asli dan tipe data untuk semua kolom. Saya melemparkan kolom pendek ke
textsebelum memberi makan keleft(), yang mengembalikantext, jaditextkolom tidak membutuhkan pemeran lain. Semua jenis pendek lainnya membutuhkan pemeran kembali ke jenis aslinya. Beberapa tipe rusak jika Anda memotongnya! Jadi ini tidak bekerja untuk semua jenis. -
Anda dapat menambahkan
LIMIT nke panggilan fungsi, tetapi fungsinya dapat dengan mudah diperluas denganLIMIT. bawaan - yang banyak lebih efisien untuk tabel besar, karena kueri di dalam fungsi plpgsql direncanakan secara independen. -
Kinerja tidak jauh lebih buruk daripada
SELECT * FROM tblbiasa - kecuali untukLIMITsaid tersebut case atau kasus lain di mana Anda membuat sarang fungsi. Fungsi PL/pgSQL yang mengembalikan set umumnya paling baik tidak bersarang: -
Saya membangun maks default. panjang 25 karakter, berikan panjang khusus sebagai parameter ke-2 atau sesuaikan default di header fungsi dengan kebutuhan Anda.
-
Fungsi ini aman dari kemungkinan serangan injeksi SQL melalui pengidentifikasi yang dibuat dengan jahat.
Jawaban terkait dengan penjelasan dan tautan lebih lanjut:
- Ganti string kosong dengan nilai nol
- Perbaiki fungsi PL/pgSQL untuk mengembalikan output dari berbagai kueri SELECT
- Nama tabel sebagai Parameter fungsi PostgreSQL
- Pemeran tipe data postgres
- Buat kueri detail skema tabel di PostgreSQL?
- Cara memeriksa apakah ada tabel dalam skema tertentu
pgAdmin
... memiliki fitur yang Anda minta, btw (untuk semua kolom):
