如何使用SQL从指定字符串中提取YES或NO字符?
解决方案
1. MySQL/MariaDB
使用REGEXP_SUBSTR匹配@符号前的YES或NO:
SELECT REGEXP_SUBSTR(column_name, '(YES|NO)(?=@)') AS target_value FROM your_table;
如果数据库版本不支持正向断言,可改用字符串定位函数组合:
SELECT SUBSTRING( column_name, LOCATE('^', column_name, LOCATE('@', column_name) - 5) + 1, LOCATE('@', column_name) - LOCATE('^', column_name, LOCATE('@', column_name) - 5) - 1 ) AS target_value FROM your_table;
2. PostgreSQL
利用正则匹配提取目标片段:
-- 方式1:捕获分组提取 SELECT (REGEXP_MATCH(column_name, '^.*\^(YES|NO)@.*$'))[2] AS target_value FROM your_table; -- 方式2:直接匹配目标值 SELECT REGEXP_SUBSTR(column_name, 'YES|NO(?=@)') AS target_value FROM your_table;
3. SQL Server
通过PATINDEX定位或字符串反转拆分实现:
-- 方式1:定位匹配 SELECT SUBSTRING( column_name, PATINDEX('%[^][YESNO]@%', column_name) + 1, CASE WHEN PATINDEX('%YES@%', column_name) > 0 THEN 3 ELSE 2 END ) AS target_value FROM your_table; -- 方式2:反转拆分(SQL Server 2017+) SELECT STRING_AGG(value, '') AS target_value FROM STRING_SPLIT(REVERSE(SUBSTRING(REVERSE(column_name), CHARINDEX('@', REVERSE(column_name)) + 1, 5)), '^') WHERE value IN ('YES', 'NO');
原正则表达式失效原因
你之前使用的Regexp(column_name,[^^|],1,4)逻辑错误:该表达式是匹配非^/|的字符并截取前4位,完全没有定位到YES/NO所在的^与@之间的位置,因此无法提取目标值。
内容的提问来源于stack exchange,提问作者Amol Salunke
相关产品推荐
相关产品推荐

