SQL查询以包含/排除字符



我有一个字典表'字典',其中列' word '包含所有英语单词的列表。

我想找到所有仅包含特定字母字符的单词,并排除其余字母。我可以这样做(请参阅下面的示例(,但是如您所见,这是彻头彻尾的丑陋。

示例

目前要查找所有包含字母'a','b','c','x','y','z'的单词,但是我要这样做:

SELECT word 
FROM   dictionary
WHERE  ( 
          word LIKE '%a%' 
          OR word LIKE '%b%' 
          OR word LIKE '%c%' 
          OR word LIKE '%x%' 
          OR word LIKE '%y%' 
          OR word LIKE '%z%' 
       ) AND ( 
             word NOT LIKE '%d%' 
             AND word NOT LIKE '%e%' 
             AND word NOT LIKE '%f%' 
             AND word NOT LIKE '%g%' 
             AND word NOT LIKE '%h%' 
             AND word NOT LIKE '%i%' 
             AND word NOT LIKE '%j%' 
             AND word NOT LIKE '%k%' 
             AND word NOT LIKE '%l%' 
             AND word NOT LIKE '%m%' 
             AND word NOT LIKE '%n%' 
             AND word NOT LIKE '%o%' 
             AND word NOT LIKE '%p%' 
             AND word NOT LIKE '%q%' 
             AND word NOT LIKE '%r%' 
             AND word NOT LIKE '%s%' 
             AND word NOT LIKE '%t%' 
             AND word NOT LIKE '%u%' 
             AND word NOT LIKE '%v%' 
             AND word NOT LIKE '%w%' ) 

使用某种形式的正则或其他优化来完成此任务的任何方法?任何技巧或提示都将不胜感激。

您可以使用REGEXP

实现它
SELECT `word `
FROM `dictionary`
WHERE `word` REGEXP '[abcxyzABCXYZ]'
    AND `word` NOT REGEXP '[defghijklmnopqrstuvwDEFGHIJKLMNOPQRSTUVW]'

这是一种更好的方法。

SELECT word 
FROM dictionary
WHERE word REGEXP '.*[abcxyzABCXYZ].*$' 
AND word NOT REGEXP '.*[defghijklmnopqrstuvwDEFGHIJKLMNOPQRSTUVW].*$';

检查此。

        set @1='a'\
        set @2 ='b'\
        set @3 ='c'\
        set @4 ='x'\
        set @5 ='y'\
        set @6 ='z'\

        set  @find=CONCAT(@1,@2,@3,@4,@5,@6)\

        set  @ALl='abcxyzdefghijklmnopqrstuvw'\ all alphabets here
        set  @ALl=replace(@ALl,@1,'')\  replace alphabet that you want
        set  @ALl=replace(@ALl,@2,'')\
        set  @ALl=replace(@ALl,@3,'')\
        set  @ALl=replace(@ALl,@4,'')\
        set  @ALl=replace(@ALl,@5,'')\
        set  @ALl=replace(@ALl,@6,'')\
        SELECT word 
        FROM dictionary
        WHERE word RLIKE CONCAT('.*[',@find,'].*$')
        AND word NOT RLIKE CONCAT('.*[',@ALl,'].*$');\

在此处检查演示

如果由于某种原因无法使用REGEXP,那么这也应该有效:

SELECT word 
  FROM dictionary
 WHERE Replace(Replace(Replace(Replace(Replace(Replace(
            word, 'a', ''),
                  'b', ''),
                  'c', ''),
                  'x', ''),
                  'y', ''),
                  'z', '') = ''

我怀疑这会很快。再说一次,我不确定是否有任何事情对于此要求=(

测试简单:

    word REGEXP '^[abcxyz]*$'

说,从开始(^(到结束($(的所有内容都必须是字符(*(字符串([](abcxyz

我在使用不敏感的整理的推定中不包括下部和上案。

不需要AND .. NOT

可能存在一个问题:如果要允许notw,您是否要匹配won't?也就是说,标点符号应该怎么办?

(问题中可能没有充分指定的其他边缘案例。(

WHERE Field not LIKE '%[^a-z0-9 .]%'

相关内容

  • 没有找到相关文章

最新更新