如何在PostgreSQL中提取数值并保留1位小数(不限数值位置)
嘿,我来帮你搞定PostgreSQL里提取数据库版本号并格式化的需求!
实现思路
核心就是两步:
- 从任意位置精准定位并提取版本号的主+次版本部分(比如
5.1.42里的5.1) - 把提取到的数值格式化保留1位小数,再和原字符串的前缀拼接回去
具体SQL代码
这里直接用CTE模拟你的测试数据,你可以替换成自己的表和字段:
WITH test_data AS ( SELECT 'Server 1 5.1.42' AS original_str UNION ALL SELECT 'Server 2 MySQL 5.7.16' UNION ALL SELECT 'Server 3 mysql-5.0.67-linux' UNION ALL SELECT 'Server 4 MARIADB - 10.2.9-MariaDB-log' UNION ALL SELECT 'Server 5 5.6.12-community-log' UNION ALL SELECT 'Server 6 mysql-advanced-5.6.12' UNION ALL SELECT 'Server 7 PERCONA - 5.7.19-17-log' ) SELECT original_str, CONCAT( -- 提取版本号之前的前缀内容 SUBSTRING(original_str FROM '^.*?(?=\d+\.\d+)'), -- 提取版本号并格式化保留1位小数 ROUND((SUBSTRING(original_str FROM '\d+\.\d+')::numeric), 1) ) AS formatted_result FROM test_data;
代码解释
SUBSTRING(original_str FROM '^.*?(?=\d+\.\d+)'):用正向预查和非贪婪匹配,精准拿到版本号(x.y格式)之前的所有内容,避免误匹配。SUBSTRING(original_str FROM '\d+\.\d+'):提取版本号的核心部分(主版本+次版本),比如从5.7.16里拿到5.7。::numeric:把提取到的字符串转成数值类型,方便后续格式化。ROUND(..., 1):将数值保留1位小数,完美符合你的需求。CONCAT(...):把前缀和格式化后的版本号拼接,得到和原字符串结构一致的结果。
运行结果
执行上面的SQL后,会得到你想要的输出:
- Server 1 5.1
- Server 2 5.7
- Server 3 5.0
- Server 4 10.2
- Server 5 5.6
- Server 6 5.6
- Server 7 5.7
内容的提问来源于stack exchange,提问作者mysqlrockstar
相关产品推荐
相关产品推荐

