如何用SQL处理格式不一致的英制距离字符串并转换为浪?
英制距离转浪单位的SQL解决方案
转换规则先明确
- 1英里(m)= 8浪(f)
- 1浪 = 220码(yd/y),码转浪公式:
码数 / 220
修正后的SQL语句
针对格式不固定的输入,我们可以分别提取每种单位对应的数值,不管它们在字符串中的位置:
SELECT -- 提取英里数转浪:1m=8f NVL(TO_NUMBER(REGEXP_SUBSTR(column_name, '(\d+)m', 1, 1, NULL, 1)), 0) * 8 -- 提取浪数直接累加 + NVL(TO_NUMBER(REGEXP_SUBSTR(column_name, '(\d+)f', 1, 1, NULL, 1)), 0) -- 提取码数转浪:码数/220 + NVL(TO_NUMBER(REGEXP_SUBSTR(column_name, '(\d+)(yds|y)', 1, 1, NULL, 1)) / 220, 0) AS FURLONGS FROM table_name;
关键正则说明(给新手的解释)
'(\d+)m':匹配数字+字母m的片段,(\d+)是捕获组(提取的数字部分),最后一个参数1表示取第一个捕获组的内容,不管m在字符串的开头、中间还是结尾都能匹配。'(\d+)f':同理,提取浪对应的数字。'(\d+)(yds|y)':匹配数字+yds或y的片段,不管码的单位是yds还是y都能捕获到前面的数字。NVL(..., 0):如果某单位不存在(比如没有m、f或码),就用0代替,避免空值报错。
测试验证
用你给出的示例数据测试:
1m→1*8 +0 +0 =8浪6f→0 +6 +0=6浪1m 2f 0y→8+2+0=10浪1m 30yds→8 +0 +30/220≈8.136浪2m 0f 32y→16+0+32/220≈16.145浪2m 2f→16+2+0=18浪
内容的提问来源于stack exchange,提问作者UKJonA
相关产品推荐
相关产品推荐

