sql >> データベース >  >> RDS >> PostgreSQL

postgrespsqlselectステートメントのデフォルトでの表示の切り捨て

    私が知っている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フィドル。

    メモ

    • すべてで機能します anyの列を持つテーブル データ型。

    • これにより、次の形式のクエリが作成および実行されます。

      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. オラクル。 caseステートメントを使用するときにキーワードがありません。エラー00905

    2. mysqlテーブル列が存在するかどうかを確認するにはどうすればよいですか?

    3. PostgreSQLVALUESコマンドの説明

    4. Fedora13でMySQLリレーショナルデータベースを使用する