对表的所有列应用 MAX(LENGTH)

Posted

技术标签:

【中文标题】对表的所有列应用 MAX(LENGTH)【英文标题】:Apply MAX(LENGTH) on all columns of a table 【发布时间】:2019-04-15 15:11:58 【问题描述】:

我想检查我的 Redshift 表的所有 VARCHAR 列中的 MAX(LENGTH),因此我知道可以对列大小进行更好的限制。 (目前所有列都是VARCHAR(65535)

我可以编写如下查询:

SELECT MAX(LENGTH(col1)), MAX(LENGTH(col2)), ...
FROM my_table

但是有没有一种方法可以编写我的查询,所以它基本上说“对每一列都应用这个”?我已经尝试过post 的答案,但它似乎只适用于经典 PostgreSQL

【问题讨论】:

你是对的,在 redshift 中没有办法做到这一点 - 你会在其他地方生成,然后在 redshift 上运行它 【参考方案1】:

您可以使用以下 SQL 生成您的选择

select sql from (
select 1 o, 'select ' sql
union
select 2, 'max(length('+attname+')),'
from pg_class c
join pg_attribute a on c.oid = a.attrelid 
where relname = '<your_table>'
and attnum > 0
union 
select 3, 'from <your_table>'
)
order by o

输出将如下所示

select 
max(length(col1)),
max(length(col2)),
...
max(length(coln)),   -- <- remove the last comma
from <your_table>

您可以运行此 sql 以从您的表中获取所有最大长度

如果这对您有帮助,请告诉我。

【讨论】:

不错的技巧,但行号出现在某些 SQL 客户端中:1 select 2 max(length(col1)), 3 max(length(col2)), 4 max(length(col3)), ... 我已经添加了那些以正确顺序构造 sql,您只能运行删除 2 的中间部分以创建列列表并将“select”和“from..”添加到输出。如果这回答了您的问题,您能否将其标记为正确,谢谢! 我的意思是我的 SQL 客户端显示查询的每个结果的行号(无论运行什么查询),这使得该技巧无法使用。幸运的是,我有另一个客户端运行良好

以上是关于对表的所有列应用 MAX(LENGTH)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Access 中对表的所有列进行 UNION ALL

oracle入门之对表数据查询

3.聚合与排序

mysql中对表操作----为所有列插入数据

命令行,对表的操作

SQL - 对表的列和的操作