如何用SQL从Salary Range字符串中提取最低、最高薪资值
SQL提取薪资范围最小/最大值实现方案
针对存储格式为$XXK-$YYK (平台 est.)的Salary Range字段,用以下方案实现即可,适配绝大多数主流SQL引擎,容错性高。
核心实现思路
- 跳过尾部括号包裹的平台来源标注,直接定位薪资区间的核心数字段
- 以区间连接符
-为界,分别识别最小值、最大值对应的数字部分 - 剔除数字附带的
$、K符号后转为整数类型,得到最终的纯数字结果
代码实现
正则方案(推荐,兼容MySQL 8.0+、PostgreSQL、BigQuery、SparkSQL、Hive等支持正则函数的引擎)
不需要逐段截断字符串,正则匹配不受后缀来源文本长度变化影响,稳定性更高:
SELECT salary_range, -- 提取$符号后、紧邻-符号前的K之前的数字作为薪资最小值 CAST(REGEXP_EXTRACT(salary_range, '\\$(\\d+)K-', 1) AS UNSIGNED) AS min_salary, -- 提取-符号后、后缀括号前的K之前的数字作为薪资最大值 CAST(REGEXP_EXTRACT(salary_range, '-(\\d+)K', 1) AS UNSIGNED) AS max_salary FROM your_table_name;
注意:PostgreSQL、BigQuery等引擎的正则提取函数不需要给
$加双反斜杠转义,直接写r'\$(\d+)K-'即可。
基础函数适配方案(适用于MySQL 5.x等不支持正则提取的引擎)
用通用字符串截断函数实现,不需要依赖正则能力:
SELECT salary_range, -- 截取第一个$之后、第一个K之前的内容转成整数 CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(salary_range, '$', -1), 'K', 1) AS UNSIGNED) AS min_salary, -- 截取-符号之后、下一个K之前的内容转成整数 CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(salary_range, '-', -1), 'K', 1) AS UNSIGNED) AS max_salary FROM your_table_name;
执行效果
针对给出的示例数据,返回结果完全符合预期:
| salary_range | min_salary | max_salary |
|---|---|---|
| $43K-$84K (LinkedIn est.) | 43 | 84 |
| $125K-$170K (Yahoo est.) | 125 | 170 |
| $10K-$30K (Glassdoor est.) | 10 | 30 |
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

