私が知っているpsqlの組み込みオプションを使用する方法はありません。
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);
メモ
-
すべてで機能します 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インジェクション攻撃に対して安全です。
詳細な説明とリンクを含む関連する回答:
- 空の文字列をnull値に置き換えます
- PL / pgSQL関数をリファクタリングして、さまざまなSELECTクエリの出力を返します
- テーブル名をPostgreSQL関数パラメータ
- Postgresデータ型キャスト
- PostgreSQLでテーブルのスキーマの詳細をクエリしますか?
- 特定のスキーマにテーブルが存在するかどうかを確認する方法
pgAdmin
...あなたが求めている機能があります、ところで(すべての列に対して):