Không có cách nào với các tùy chọn psql tích hợp sẵn mà tôi biết.
Bạn có thể đạt được mục tiêu của mình với một chức năng như @ Drazen đề xuất
- chỉ đơn giản hơn nhiều :
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;
Ví dụ về cuộc gọi:
SELECT * FROM f_trunc_columns(NULL::my_table);
SELECT * FROM f_trunc_columns(NULL::"MySchema"."My_funny_tbl", 11);
Ghi chú
-
Hoạt động cho bất kỳ bảng có các cột bất kỳ kiểu dữ liệu.
-
Điều này xây dựng và thực thi một truy vấn có dạng:
SELECT "FoO_id", left(c_text, 11), left(c_vc, 11)::character varying FROM "FoO";
-
Nó chỉ rút ngắn các cột của kiểu dữ liệu đã chọn và để lại những cột khác. Tôi đã bao gồm các kiểu ký tự cơ bản:
bpchar
là tên nội bộ củacharacter
và tất cả các biến thể.
varchar
tên nội bộ của ký tựcharacter varying
và tất cả các biến thể.
Mở rộng theo nhu cầu của bạn. -
Hàm trả về tên cột và kiểu dữ liệu ban đầu cho tất cả các cột. Tôi truyền các cột ngắn thành
text
trước khi đưa vàoleft()
, trả vềtext
, vì vậytext
cột không cần đúc khác. Tất cả các kiểu rút gọn khác cần được đúc trở lại kiểu ban đầu. Một số loại bị hỏng nếu bạn cắt ngắn! Vì vậy, điều này không hoạt động cho tất cả các loại. -
Bạn có thể thêm
LIMIT n
cho lệnh gọi hàm, nhưng có thể dễ dàng mở rộng hàm vớiLIMIT
tích hợp sẵn - là nhiều hiệu quả hơn cho các bảng lớn, vì truy vấn bên trong hàm plpgsql được lập kế hoạch độc lập. -
Hiệu suất không tệ hơn nhiều so với
SELECT * FROM tbl
đơn giản - ngoại trừLIMIT
đã nói trường hợp hoặc các trường hợp khác mà bạn lồng hàm. Các hàm PL / pgSQL đặt-trả về thường tốt nhất không được lồng vào nhau: -
Tôi đã tạo trong một CPC tối đa mặc định. độ dài 25 ký tự, chuyển độ dài tùy chỉnh làm thông số thứ 2 hoặc điều chỉnh giá trị mặc định trong tiêu đề hàm theo nhu cầu của bạn.
-
Chức năng này an toàn trước các cuộc tấn công chèn SQL có thể xảy ra thông qua các mã nhận dạng được tạo thủ công độc hại.
Các câu trả lời có liên quan với nhiều giải thích và liên kết hơn:
- Thay thế chuỗi trống bằng giá trị rỗng
- Refactor một hàm PL / pgSQL để trả về kết quả đầu ra của các truy vấn SELECT khác nhau
- Tên bảng dưới dạng Tham số hàm PostgreSQL
- Truyền kiểu dữ liệu Postgres
- Truy vấn chi tiết lược đồ của một bảng trong PostgreSQL?
- Cách kiểm tra xem bảng có tồn tại trong một lược đồ nhất định không
pgAdmin
... có tính năng bạn đang yêu cầu, btw (cho tất cả các cột):