如何根据键的出现位置获取键值对中对应的目标值
获取键对应值的SQL方案
假设你的表中key字段存储的是类似key1<>值1|key2<>值2|key5<>961|...格式的字符串(键值对用|分隔,键与值用<>分隔),可以通过以下两种方式获取key5对应的961:
方法1:使用基础字符串函数(兼容多数数据库)
SELECT SUBSTR( `key`, -- 计算值的起始位置:key5<>的起始位置加上自身长度 INSTR(`key`, 'key5<>', 1, 1) + LENGTH('key5<>'), -- 计算值的长度:找到后续第一个|的位置,或取到字符串末尾 CASE WHEN INSTR(`key`, '|', INSTR(`key`, 'key5<>', 1, 1)) > 0 THEN INSTR(`key`, '|', INSTR(`key`, 'key5<>', 1, 1)) - (INSTR(`key`, 'key5<>', 1, 1) + LENGTH('key5<>')) ELSE LENGTH(`key`) - (INSTR(`key`, 'key5<>', 1, 1) + LENGTH('key5<>')) + 1 END ) AS key5_value FROM your_table;
逻辑说明:
- 先用
INSTR定位key5<>的起始位置,加上key5<>的长度得到对应值的起始索引。 - 通过判断后续是否存在
|分隔符,确定值的结束位置,从而截取到完整的对应值。
方法2:使用正则表达式(部分数据库支持,如Oracle、MySQL 8.0+)
如果你的数据库支持正则表达式截取,可以用更简洁的写法:
Oracle 版本
SELECT REGEXP_SUBSTR(`key`, 'key5<>([^|]+)', 1, 1, NULL, 1) AS key5_value FROM your_table;
MySQL 版本
SELECT REGEXP_SUBSTR(`key`, 'key5<>([^|]+)', 1, 1, 'c', 1) AS key5_value FROM your_table;
逻辑说明:
- 正则表达式
key5<>([^|]+)匹配key5<>后直到第一个|的所有字符,最后一个参数指定提取括号内的捕获组内容,也就是对应的数值部分。
内容的提问来源于stack exchange,提问作者Toqa
相关产品推荐
相关产品推荐

