SELECT
c.table_schema,
c.table_name,
c.column_name,
c.data_type,
c.udt_name,
CASE
-- 数值
WHEN c.udt_name IN ('int2','int4','int8','float4','float8','numeric','money')
THEN 'NUMERIC'
-- 布尔
WHEN c.udt_name = 'bool'
THEN 'BOOLEAN'
-- 日期/时间
WHEN c.udt_name IN ('date','time','timetz','timestamp','timestamptz','interval')
THEN 'DATETIME'
-- 字符
WHEN c.udt_name IN ('bpchar','varchar','text')
THEN 'STRING'
-- JSON
WHEN c.udt_name IN ('json','jsonb')
THEN 'JSON'
-- 数组
WHEN c.udt_name ILIKE '%[]'
THEN 'ARRAY'
-- 其余全部进 OTHER
ELSE 'OTHER'
END AS type_category
FROM information_schema.columns c
WHERE c.table_schema = :schema
AND c.table_name = :table
ORDER BY c.ordinal_position;