PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Съкращаване на дисплея по подразбиране в операторите за избор на postgres psql

Няма начин с вградени опции на psql, за които да знам.
Можете да постигнете целта си с функция като @Drazen предложи - просто много по-просто :

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;

Примери за обаждания:

SELECT * FROM f_trunc_columns(NULL::my_table);
SELECT * FROM f_trunc_columns(NULL::"MySchema"."My_funny_tbl", 11);

SQL Fiddle.

Бележки

  • Работи за всеки таблица с колони от всеки тип данни.

  • Това изгражда и изпълнява заявка от формата:

    SELECT "FoO_id", left(c_text, 11), left(c_vc, 11)::character varying
    FROM   "FoO";
    
  • Той съкращава само колони от избрани типове данни и оставя други на мира. Включих основни типове символи:
    bpchar е вътрешното име за character и всички варианти.
    varchar е вътрешното име за character varying и всички варианти.
    Разширете според вашите нужди.

  • Функцията връща оригинални имена на колони и типове данни за всички колони. Прехвърлям къси колони към text преди подаване към left() , който връща text , така че text колоните не се нуждаят от друг кастинг. Всички други съкратени типове се нуждаят от връщане към оригиналния тип. Някои типове се повреждат, ако съкратите! Така че това не работи за всички типове.

  • Можете да добавите LIMIT n към извикването на функцията, но функцията може лесно да бъде разширена с вграден LIMIT - което е много по-ефективен за големи таблици, тъй като заявката във функцията plpgsql се планира независимо.

  • Ефективност не е много по-лош от обикновен SELECT * FROM tbl - с изключение на споменатия LIMIT случай или други случаи, в които влагате функцията. PL/pgSQL функциите, връщащи множество, обикновено е най-добре да не са вложени:

  • Вградих макс. дължина от 25 знака, подайте персонализирана дължина като 2-ри параметър или адаптирайте стойността по подразбиране в заглавката на функцията към вашите нужди.

  • Тази функция е безопасна срещу възможни атаки чрез SQL инжектиране чрез злонамерено създадени идентификатори.

Свързани отговори с повече обяснения и връзки:

pgAdmin

... между другото има функцията, която искате (за всички колони):



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. функция без ударение на postgres срещу транслитерация на RoR

  2. Oracle еквивалент на Postgres' DISTINCT ON?

  3. Подвижен брой редове в интервал от време

  4. psycopg2 еквивалент на mysqldb.escape_string?

  5. как да покажа пълния код на съхранената процедура?