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:
bpchar
adalah nama internal untukcharacter
dan semua varian.varchar
adalah nama internal untukcharacter varying
dan semua varian.
Perluas sesuai kebutuhan Anda. -
Fungsi mengembalikan nama kolom asli dan tipe data untuk semua kolom. Saya melemparkan kolom pendek ke
text
sebelum memberi makan keleft()
, yang mengembalikantext
, jaditext
kolom 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 n
ke 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 tbl
biasa - kecuali untukLIMIT
said 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):