PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Domyślnie obcinanie wyświetlania w instrukcjach postgres psql select

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

Skrzypce SQL.

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 nazwa character i wszystkie warianty.
    varchar to wewnętrzna nazwa character 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 do left() , który zwraca text , więc text 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ą wbudowanego LIMIT - 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 wspomnianego LIMIT 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:

pgAdministrator

... ma funkcję, o którą prosisz, btw (dla wszystkich kolumn):



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak obliczyć różnicę między dwoma znacznikami czasu w PostgreSQL

  2. Czy mogę pisać funkcje PostgreSQL w Ruby on Rails?

  3. Mac + virtualenv + pip + postgresql =Błąd:nie znaleziono pliku wykonywalnego pg_config

  4. Jak wstawić do tabeli z innej tabeli, dopasowując wartości?

  5. PSQLException:BŁĄD:wartość null w kolumnie narusza ograniczenie not-null