You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

字符串末尾字符精确匹配问题:如何解决II与III的误匹配?

解决姓名后缀精确匹配的问题

这个问题的核心是正则匹配的顺序优先级——你现在先判断II$,但III的末尾刚好是II,所以会被误匹配。解决思路很简单:把更长的后缀(比如III)放在更前面的判断分支里,让长模式优先匹配,就不会被短模式截胡了。

修正后的SQL查询

SELECT 
    LAST_NAME AS A,
    CASE 
        WHEN REGEXP_INSTR(LAST_NAME, 'III$') > 0 THEN SUBSTR(LAST_NAME, REGEXP_INSTR(LAST_NAME, 'III$'), LENGTH(LAST_NAME))
        WHEN REGEXP_INSTR(LAST_NAME, 'II$') > 0 THEN SUBSTR(LAST_NAME, REGEXP_INSTR(LAST_NAME, 'II$'), LENGTH(LAST_NAME))
        WHEN REGEXP_INSTR(LAST_NAME, 'JR$') > 0 THEN SUBSTR(LAST_NAME, REGEXP_INSTR(LAST_NAME, 'JR$'), LENGTH(LAST_NAME))
        WHEN REGEXP_INSTR(LAST_NAME, 'SR$') > 0 THEN SUBSTR(LAST_NAME, REGEXP_INSTR(LAST_NAME, 'SR$'), LENGTH(LAST_NAME))
    END AS SUFFIX
FROM TBL_LAST_NAME 
WHERE LAST_NAME IN ('MANFORTI JR','KRUMPAK III','PURDY II','MARRONE SR')

为什么这样能解决问题?

  • 当处理KRUMPAK III时,第一个分支的III$会先匹配到末尾的III,直接返回正确的后缀,不会走到II$的判断
  • 只有当字符串确实以II结尾(比如PURDY II)时,才会触发第二个分支
  • JR和SR因为长度相同,顺序不影响,但保持清晰的排序更好

更简洁的实现方式

如果你想精简代码,也可以用REGEXP_SUBSTR直接提取后缀,正则模式里用|分隔多个规则,同样遵循左到右的匹配优先级:

SELECT 
    LAST_NAME AS A,
    REGEXP_SUBSTR(LAST_NAME, 'III$|II$|JR$|SR$') AS SUFFIX
FROM TBL_LAST_NAME 
WHERE LAST_NAME IN ('MANFORTI JR','KRUMPAK III','PURDY II','MARRONE SR')

测试输出验证

执行上述任意查询后,都会得到预期的精准结果:

ASUFFIX
MANFORTI JRJR
KRUMPAK IIIIII
PURDY IIII
MARRONE SRSR

内容的提问来源于stack exchange,提问作者Praveenks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:13:18