SQL:如何从无序键值对字符串中提取指定字段值
提取指定键对应的值(SQL实现)
通用思路
核心是定位[someNum]=后的内容,截取到下一个键值对的起始标识(,[)或字符串结尾。以下是主流数据库的具体实现:
MySQL/MariaDB(8.0+)
使用REGEXP_SUBSTR函数捕获目标值:
SELECT REGEXP_SUBSTR(your_column_name, '\\[someNum\\]=([^,]+)', 1, 1, 'e') AS someNum_value FROM your_table_name;
说明:
\\[someNum\\]:转义匹配[someNum](方括号是正则特殊字符)([^,]+):捕获等号后所有非逗号的字符,直到下一个键值对的逗号- 参数
'e'指定返回捕获组的内容
PostgreSQL
用REGEXP_MATCHES提取捕获组,取数组第一个元素:
SELECT (REGEXP_MATCHES(your_column_name, '\[someNum\]=([^,]+)'))[1] AS someNum_value FROM your_table_name;
或者用REGEXP_REPLACE替换无关内容:
SELECT REGEXP_REPLACE(your_column_name, '.*\[someNum\]=([^,]+).*', '\1') AS someNum_value FROM your_table_name;
SQL Server
正则方式(2017+)
SELECT REGEXP_SUBSTR(your_column_name, '\[someNum\]=([^,]+)', 1, 1, 0, 1) AS someNum_value FROM your_table_name;
兼容低版本的字符串截取写法
SELECT SUBSTRING( your_column_name, CHARINDEX('[someNum]=', your_column_name) + LEN('[someNum]='), CHARINDEX(',[', your_column_name, CHARINDEX('[someNum]=', your_column_name)) - (CHARINDEX('[someNum]=', your_column_name) + LEN('[someNum]=')) ) AS someNum_value FROM your_table_name WHERE your_column_name LIKE '%[someNum]=%';
Oracle
使用REGEXP_SUBSTR指定捕获组:
SELECT REGEXP_SUBSTR(your_column_name, '\[someNum\]=([^,]+)', 1, 1, NULL, 1) AS someNum_value FROM your_table_name;
注意事项
- 如果目标值可能包含逗号,可将正则调整为
\[someNum\]=([^\[]+),匹配到下一个[前的内容 - 低版本数据库需优先使用字符串截取的兼容写法,避免依赖正则函数
内容的提问来源于stack exchange,提问作者user3440639
相关产品推荐
相关产品推荐

