我有一个字典表' 字典',其中列' 字'包含所有英语单词的列表。
我想查找仅包含特定字母字符的所有单词,并排除字母表的其余部分。我能够这样做(见下面的例子),但正如你所看到的,它是完全丑陋的。
示例
目前要查找包含字母'' 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%' )
使用某种形式的正则表达式或其他优化来完成此任务的任何方法? 任何技巧或提示都会非常感激。
答案 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,'].*$');\\
答案 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 .]%'