SQL查询包含/排除字符

时间:2018-02-16 07:11:47

标签: mysql sql query-optimization

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

我想查找仅包含特定字母字符的所有单词,并排除字母表的其余部分。我能够这样做(见下面的例子),但正如你所看到的,它是完全丑陋的。

示例

目前要查找包含字母'' b',' c',' x',&#39的所有字词; 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%' ) 

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

6 个答案:

答案 0 :(得分:2)

这是一种更好的方法。

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

答案 1 :(得分:1)

您可以使用REGEXP

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

答案 2 :(得分:0)

检查这个。

        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,'].*$');\\

Check Demo Here

答案 3 :(得分:0)

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

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

我怀疑它会非常快。再说一次,我不确定这个要求会有什么特别快=)

答案 4 :(得分:0)

测试很简单:

    word REGEXP '^[abcxyz]*$'

这表示从开始(^)到结束($)的所有内容都必须是零个或多个(*)字符的字符串([]abcxyz

我假设您使用不区分大小写的排序规则,并未包括大小写。

不需要AND .. NOT

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

(可能还有其他边缘情况在问题中没有充分说明。)

答案 5 :(得分:0)

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