Postgresql 如何创建一个有N个列的表

Postgresql 如何创建一个有N个列的表,第1张

概述如果需要创建一个有99列的表,列名都是有规律的比如s01,s02,s03……也许你会想到如下语句 CREATE TABLE tb_sxx ( s01 varchar(10), s02 varchar(10), s03 varchar(10), …… s99 varchar(10) ); 有没有更快捷的方法呢?当然有了,不妨借助一下Postgresql的三个有力函数 generate_s


如果需要创建一个有99列的表,列名都是有规律的比如s01,s02,s03……也许你会想到如下语句

CREATEtabletb_sxx(s01varchar(10),s02varchar(10),s03varchar(10),……s99varchar(10));


有没有更快捷的方法呢?当然有了,不妨借助一下Postgresql的三个有力函数
generate_serIEs(x,y) --生成x到y之间的值
array_agg(x) --把x值转成 如{1,2,3,4}的格式,即转成数组
array_to_string({},',') 把数组转成字符串,其中 ',' 是数组的分隔符


为了更直观的理解以下举例(生成一个5列的表),分步说明,如果对上述三个函数很熟悉可直接到第6步:


1.生成1到5之间的数
SELECT generate_serIEs(1,5);

hotel=>SELECTgenerate_serIEs(1,5);generate_serIEs-----------------12345(5rows)

2.把1到5的数转成数组
SELECT array_agg(i)
FROM generate_serIEs(1,5) AS i;

hotel=>SELECTarray_agg(i)hotel->FROMgenerate_serIEs(1,5)ASi;array_agg-------------{1,4,5}(1row)


3.加工第2步生成的数据,将格式变为{s01,s03,s04,s05}
SELECT array_agg('s' || lpad(i::text,'0'))
FROM generate_serIEs(1,5) AS i;

hotel=>SELECTarray_agg('s'||lpad(i::text,'0'))hotel->FROMgenerate_serIEs(1,5)ASi;array_agg-----------------------{s01,s05}(1row)

解释:
i::text 是将i转换成字符类形
lpad 是将i转换为2位,位数不足时在左边加0


4.加工第3步生成的数据,将其转换为{s01 varchar(10),s02 varchar(10),s03 varchar(10),s04 varchar(10),s05 varchar(10)}
SELECT array_agg('s' || lpad(i::text,'0') || ' varchar(10)')
FROM generate_serIEs(1,'0')||'varchar(10)')hotel->FROMgenerate_serIEs(1,5)ASi;array_agg---------------------------------------------------------------------------------------------{"s01varchar(10)","s02varchar(10)","s03varchar(10)","s04varchar(10)","s05varchar(10)"}(1row)


5.加工第4步生成的数据,将其转换成字符串
SELECT array_to_string (
array_agg('s' || lpad(i::text,'0') || ' varchar(10)')
,')
FROM generate_serIEs(1,5) AS i;

hotel=>SELECTarray_to_string(hotel(>array_agg('s'||lpad(i::text,'0')||'varchar(10)')hotel(>,')hotel->FROMgenerate_serIEs(1,5)ASi;array_to_string---------------------------------------------------------------------------------s01varchar(10),s04varchar(10),s05varchar(10)(1row)


6.最终生成建表语句
SELECT 'CREATE table tb_s5 ( ' ||
array_to_string (
array_agg('s' || lpad(i::text,') ||
');'
FROM generate_serIEs(1,5) AS i;

hotel=>SELECT'CREATEtabletb_s5('||hotel->array_to_string(hotel(>array_agg('s'||lpad(i::text,')||hotel->');'hotel->FROMgenerate_serIEs(1,5)ASi;?column?--------------------------------------------------------------------------------------------------------CREATEtabletb_s5(s01varchar(10),s05varchar(10));(1row)

至此建表语句就生成了,复制粘贴就可以执行了,如果是psql亦可用下面的将下面的语句保存为
build_s5.psql文件,然后用psql直接执行
psql -h localhost -p 5432 -U username -f build_s5.psql -d dbname


文件内容如下:


\a \t
SELECT 'CREATE table tb_s5 ( ' ||
array_to_string (
array_agg('s' || lpad(i::text,5) AS i;
\g create_s5.sql
\i create_s5.sql


解释:\a 关闭对齐模式\t 关闭标行输出\g 将查询结果输出到指定文件\i 执行文件

总结

以上是内存溢出为你收集整理的Postgresql 如何创建一个有N个列的表全部内容,希望文章能够帮你解决Postgresql 如何创建一个有N个列的表所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1174786.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存