查询表中唯一数据类型时,CHAR不同长度被判定为不同类型的问题
统计表的唯一基础数据类型
你遇到的问题是:原查询直接用data_type统计时,会把带不同长度/精度的同基础类型(比如CHAR(13)和CHAR(12))判定为不同类型,导致计数结果不符合预期。要实现将这类同基础类型视为同一类的需求,需要先提取类型的基础名称(忽略括号内的参数部分),再统计唯一值。
修改后的SQL查询
以下是支持正则替换的数据库(如PostgreSQL、MySQL)的解决方案:
WITH UniqueColumnTypes AS ( SELECT table_name, -- 用正则去掉括号及内部内容,只保留基础类型名 COUNT(DISTINCT REGEXP_REPLACE(data_type, '\(.*\)', '', 'g')) AS unique_types FROM information_schema.columns WHERE table_schema NOT IN ('pg_catalog', 'information_schema') GROUP BY table_name ) SELECT table_name, unique_types FROM UniqueColumnTypes;
针对你的Book表验证
以Stud.Book表为例,处理后各列的基础类型会被统一为:
ISBN→CHARTitle→VARCHARPublisher→CHARYear→SMALLINTPages→SMALLINTPrice→DECIMAL
统计后唯一类型数为4种,完全符合你的预期。
兼容无正则支持的数据库(如旧版SQL Server)
如果你的数据库不支持REGEXP_REPLACE,可以用字符串截取函数实现相同效果:
WITH UniqueColumnTypes AS ( SELECT table_name, COUNT(DISTINCT CASE WHEN CHARINDEX('(', data_type) > 0 THEN LEFT(data_type, CHARINDEX('(', data_type)-1) ELSE data_type END ) AS unique_types FROM information_schema.columns WHERE table_schema NOT IN ('pg_catalog', 'information_schema') GROUP BY table_name ) SELECT table_name, unique_types FROM UniqueColumnTypes;
内容的提问来源于stack exchange,提问作者Kurbamit
相关产品推荐
相关产品推荐

