PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Memotong tampilan secara default di pernyataan pilih postgres psql

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);

SQL Fiddle.

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 untuk character dan semua varian.
    varchar adalah nama internal untuk character 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 ke left() , yang mengembalikan text , jadi text 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 dengan LIMIT . 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 untuk LIMIT 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:

pgAdmin

... memiliki fitur yang Anda minta, btw (untuk semua kolom):



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Untuk apa '$$' digunakan di PL/pgSQL

  2. Pencarian teks lengkap Postgres dengan sinonim

  3. menggunakan salinan di postgresql?

  4. Temukan semua baris menggunakan beberapa rentang Unicode (seperti karakter Cyrillic) dengan PostgreSQL?

  5. Apakah ada operator TERTUTUP postgres?