Với truy vấn sau, chúng ta có thể nhận được danh sách tên cột và kiểu dữ liệu của một bảng trong PostgreSQL.
Câu trả lời:
Mở psql
dòng lệnh và nhập:
\d+ table_name
psql -E
và đối với mọi lệnh dấu gạch chéo ngược, SQL tương ứng sẽ được hiển thị trước kết quả của lệnh.
select column_name,data_type
from information_schema.columns
where table_name = 'table_name';
với truy vấn trên, bạn có thể cột và kiểu dữ liệu của nó
geometry(Geometry,[SRID])
).
table_catalog = 'my_database'
và table_schema = 'my_schema'
để chỉ lấy các cột từ một bảng cụ thể của một lược đồ cụ thể của một cơ sở dữ liệu cụ thể.
SELECT
a.attname as "Column",
pg_catalog.format_type(a.atttypid, a.atttypmod) as "Datatype"
FROM
pg_catalog.pg_attribute a
WHERE
a.attnum > 0
AND NOT a.attisdropped
AND a.attrelid = (
SELECT c.oid
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relname ~ '^(hello world)$'
AND pg_catalog.pg_table_is_visible(c.oid)
);
Thông tin thêm về nó: http://www.postgresql.org/docs/9.3/static/catalog-pg-attribute.html
c.relname ~ '^(hello world)$
thay vì đơn giản c.relname = 'hello world'
?
Câu trả lời Pratik được cập nhật để hỗ trợ nhiều lược đồ và giá trị nullable:
SELECT
"pg_attribute".attname as "Column",
pg_catalog.format_type("pg_attribute".atttypid, "pg_attribute".atttypmod) as "Datatype",
not("pg_attribute".attnotnull) AS "Nullable"
FROM
pg_catalog.pg_attribute "pg_attribute"
WHERE
"pg_attribute".attnum > 0
AND NOT "pg_attribute".attisdropped
AND "pg_attribute".attrelid = (
SELECT "pg_class".oid
FROM pg_catalog.pg_class "pg_class"
LEFT JOIN pg_catalog.pg_namespace "pg_namespace" ON "pg_namespace".oid = "pg_class".relnamespace
WHERE
"pg_namespace".nspname = 'schema'
AND "pg_class".relname = 'table'
);
Một phiên bản hỗ trợ tìm tên cột và kiểu của bảng trong một lược đồ cụ thể và sử dụng JOIN mà không cần bất kỳ truy vấn con nào
SELECT
pg_attribute.attname AS column_name,
pg_catalog.format_type(pg_attribute.atttypid, pg_attribute.atttypmod) AS data_type
FROM
pg_catalog.pg_attribute
INNER JOIN
pg_catalog.pg_class ON pg_class.oid = pg_attribute.attrelid
INNER JOIN
pg_catalog.pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE
pg_attribute.attnum > 0
AND NOT pg_attribute.attisdropped
AND pg_namespace.nspname = 'my_schema'
AND pg_class.relname = 'my_table'
ORDER BY
attnum ASC;
SELECT DISTINCT
ROW_NUMBER () OVER (ORDER BY pgc.relname , a.attnum) as rowid ,
pgc.relname as table_name ,
a.attnum as attr,
a.attname as name,
format_type(a.atttypid, a.atttypmod) as typ,
a.attnotnull as notnull,
com.description as comment,
coalesce(i.indisprimary,false) as primary_key,
def.adsrc as default
FROM pg_attribute a
JOIN pg_class pgc ON pgc.oid = a.attrelid
LEFT JOIN pg_index i ON
(pgc.oid = i.indrelid AND i.indkey[0] = a.attnum)
LEFT JOIN pg_description com on
(pgc.oid = com.objoid AND a.attnum = com.objsubid)
LEFT JOIN pg_attrdef def ON
(a.attrelid = def.adrelid AND a.attnum = def.adnum)
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = pgc.relnamespace
WHERE 1=1
AND pgc.relkind IN ('r','')
AND n.nspname <> 'pg_catalog'
AND n.nspname <> 'information_schema'
AND n.nspname !~ '^pg_toast'
AND a.attnum > 0 AND pgc.oid = a.attrelid
AND pg_table_is_visible(pgc.oid)
AND NOT a.attisdropped
ORDER BY rowid
;
Để làm cho chủ đề này 'hoàn thiện hơn'.
Tôi yêu cầu tên cột và kiểu dữ liệu trên câu lệnh SELECT (không phải bảng).
Nếu bạn muốn thực hiện việc này trên một câu lệnh SELECT thay vì một bảng hiện có thực, bạn có thể làm như sau:
DROP TABLE IF EXISTS abc;
CREATE TEMPORARY TABLE abc AS
-- your select statement here!
SELECT
*
FROM foo
-- end your select statement
;
select column_name, data_type
from information_schema.columns
where table_name = 'abc';
DROP IF EXISTS abc;
Giải thích ngắn gọn, nó tạo ra một bảng (tạm thời) cho câu lệnh lựa chọn của bạn, mà bạn có thể 'gọi' thông qua truy vấn được cung cấp bởi (trong số những người khác) @a_horse_with_no_name và @selva.
Hi vọng điêu nay co ich.
mà không cần đề cập đến lược đồ, bạn cũng có thể nhận được các chi tiết cần thiết Hãy thử truy vấn này->
chọn tên_bảng, kiểu_dữ liệu từ information_schema.columns nơi table_name = 'table_name';
chọn column_name, data_type từ information_schema.columns trong đó table_name = 'your_table_name' và table_catalog = 'your_database_name' và table_schema = 'your_schema_name';