过滤英文词表中已有单数形式的复数单词遇SQL逻辑问题求助
问题分析与解决方案
你的SQL逻辑完全搞反了:当前逻辑是「给单词加s后,若存在于以s结尾的词列表中,就标记原单词为复数」,这会导致像that这类单数词,只要表中存在thats,就被错误标记成复数,完全偏离了你的需求。
你真正要做的是识别出本身是复数(以s结尾),且对应单数形式(去掉末尾s)存在于表中的单词,以此来排除它们。
修正后的SQL语句
SELECT word, CASE -- 先锁定以s结尾的复数候选词 WHEN word LIKE '%s' -- 再验证去掉末尾s后的单数形式是否存在于表内 AND LEFT(word, LENGTH(word)-1) IN (SELECT word FROM `words.freq`) THEN 'plural' ELSE 'sing' END AS plural FROM `words.freq` LIMIT 1000;
直接排除复数词的写法
如果不需要标记,而是直接过滤掉这些有对应单数的复数词,可以用以下语句:
SELECT word, count FROM `words.freq` WHERE NOT ( word LIKE '%s' AND LEFT(word, LENGTH(word)-1) IN (SELECT word FROM `words.freq`) ) LIMIT 1000;
补充说明
上述逻辑仅针对常规加s的复数词,若你的表包含不规则复数(比如bus→buses、baby→babies),需要额外处理这类特殊规则,但如果只覆盖常规场景,以上语句足够满足需求。
内容的提问来源于stack exchange,提问作者Eugene T
相关产品推荐
相关产品推荐

