如何在Presto中将多列数值合并为单个数组?
解决SQL合并数值列为数组格式的问题
问题场景
现有表格数据:
| Array1 | Array2 |
|---|---|
| 0.99993938 | 1.88473736 |
| 4.66993938 | 10.7473736 |
需要将每行的Array1和Array2合并为[值1, 值2]格式的数组列Array3,预期结果:
| Array3 |
|---|
| [0.99993938, 1.88473736] |
| [4.66993938, 10.7473736] |
使用select concat(Array1, Array2) from table执行后,结果既缺少逗号分隔,还丢失了小数部分。
问题原因
直接使用concat拼接数值类型列时,数据库会自动做隐式类型转换:
- 数值转字符串的默认规则可能会截断小数位(比如只保留整数或少数几位小数);
- 拼接过程没有添加自定义分隔符,导致两个值直接连在一起。
解决方案
根据不同SQL方言,提供以下可行写法:
1. MySQL/MariaDB
显式将数值转为保留完整小数位的字符串,再拼接格式符号:
-- 方法1:用CAST保留完整小数位 SELECT CONCAT('[', CAST(Array1 AS CHAR), ', ', CAST(Array2 AS CHAR), ']') AS Array3 FROM your_table; -- 方法2:用FORMAT指定小数位数(注意:FORMAT会自动添加千分位,若不需要则用方法1) SELECT CONCAT('[', FORMAT(Array1, 8), ', ', FORMAT(Array2, 8), ']') AS Array3 FROM your_table;
2. PostgreSQL
可以直接生成数组类型,或转成目标字符串格式:
-- 生成原生数组类型 SELECT ARRAY[Array1, Array2] AS Array3 FROM your_table; -- 转成指定字符串格式 SELECT '[' || Array1::TEXT || ', ' || Array2::TEXT || ']' AS Array3 FROM your_table;
3. SQL Server
用STR函数指定数值的总长度和小数位数,再拼接:
SELECT CONCAT('[', STR(Array1, 10, 8), ', ', STR(Array2, 10, 8), ']') AS Array3 FROM your_table;
STR参数说明:STR(数值, 总长度, 小数位数),示例中总长度10足够容纳目标数值。
内容的提问来源于stack exchange,提问作者sonia
相关产品推荐
相关产品推荐

