You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:54:44