我当前的查询如下所示:
SELECT * FROM fiberbox f WHERE f.fiberBox LIKE '%1740 %' OR f.fiberBox LIKE '%1938 %' OR f.fiberBox LIKE '%1940 %'
Run Code Online (Sandbox Code Playgroud)
我做了一些环顾四周,找不到任何类似于LIKE IN()的东西 - 我设想它的工作方式如下:
SELECT * FROM fiberbox f WHERE f.fiberbox LIKE IN('%140 %', '%1938 %', '%1940 %')
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?我只是以错误的方式思考问题 - 一些我从未见过的模糊命令.
MySQL 5.0.77-community-log
Pau*_*xon 432
一个REGEXP 可能会更有效,但你必须对它进行基准测试,以确保,如
SELECT * from fiberbox where field REGEXP '1740|1938|1940';
Run Code Online (Sandbox Code Playgroud)
Dav*_*oll 171
Paul Dixon的回答对我来说非常出色.除此之外,以下是我对那些对使用REGEXP感兴趣的人所观察到的一些事情:
使用通配符完成多个LIKE过滤器:
SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
OR field LIKE '%1938 %'
OR field LIKE '%1940 %';
Run Code Online (Sandbox Code Playgroud)
使用REGEXP替代方案:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |1940 ';
Run Code Online (Sandbox Code Playgroud)
REGEXP引号内的值和|之间的值 (OR)运算符被视为通配符.通常,REGEXP将要求通配符表达式(如(.*)1740(.*))作为%1740%.
如果您需要更多地控制通配符的放置,请使用以下某些变体:
使用受控通配符放置完成LIKE:
SELECT * FROM fiberbox WHERE field LIKE '1740 %'
OR field LIKE '%1938 '
OR field LIKE '%1940 % test';
Run Code Online (Sandbox Code Playgroud)
使用:
SELECT * FROM fiberbox WHERE field REGEXP '^1740 |1938 $|1940 (.*) test';
Run Code Online (Sandbox Code Playgroud)
将^放在值的前面表示该行的开始.
在值之后放置$表示行尾.
放置(.*)的行为与%通配符非常相似.
的.表示除换行符之外的任何单个字符.放置.inside()with*(.*)添加一个重复模式,指示任意数量的字符,直到行尾.
有更有效的方法来缩小特定匹配,但这需要更多的正则表达式审查.注意:并非所有正则表达式模式似乎都适用于MySQL语句.您需要测试您的模式并查看哪些有效.
最后,要完成多个LIKE和NOT LIKE过滤器:
SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
OR field LIKE '%1938 %'
OR field NOT LIKE '%1940 %'
OR field NOT LIKE 'test %'
OR field = '9999';
Run Code Online (Sandbox Code Playgroud)
使用REGEXP替代方案:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |^9999$'
OR field NOT REGEXP '1940 |^test ';
Run Code Online (Sandbox Code Playgroud)
或混合替代品:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 '
OR field NOT REGEXP '1940 |^test '
OR field NOT LIKE 'test %'
OR field = '9999';
Run Code Online (Sandbox Code Playgroud)
请注意,我在单独的WHERE过滤器中分隔了NOT集.我尝试使用否定模式,前瞻性模式等.但是,这些表达似乎没有产生预期的结果.在上面的第一个例子中,我使用^ 9999 $表示完全匹配.这允许您在同一表达式中添加与通配符匹配的特定匹配项.但是,您也可以混合使用这些类型的语句,如您在列出的第二个示例中所示.
关于性能,我对现有的表进行了一些小的测试,发现我的变体之间没有差异.但是,我认为性能可能是更大的数据库,更大的字段,更大的记录数和更复杂的过滤器的问题.
一如既往,使用上面的逻辑是有道理的.
如果您想了解有关正则表达式的更多信息,我建议将www.regular-expressions.info作为一个很好的参考站点.
Qua*_*noi 14
您可以创建内联视图或临时表,用您的值填充它并发出以下信息:
SELECT *
FROM fiberbox f
JOIN (
SELECT '%1740%' AS cond
UNION ALL
SELECT '%1938%' AS cond
UNION ALL
SELECT '%1940%' AS cond
) ?
ON f.fiberBox LIKE cond
Run Code Online (Sandbox Code Playgroud)
然而,这可以返回你多行的fiberbox是像'1740, 1938',所以这种查询可以更好地适合你:
SELECT *
FROM fiberbox f
WHERE EXISTS
(
SELECT 1
FROM (
SELECT '%1740%' AS cond
UNION ALL
SELECT '%1938%' AS cond
UNION ALL
SELECT '%1940%' AS cond
) ?
WHERE f.fiberbox LIKE cond
)
Run Code Online (Sandbox Code Playgroud)
use*_*379 12
Regexp方式与值列表
SELECT * FROM table WHERE field regexp concat_ws("|",
"111",
"222",
"333");
Run Code Online (Sandbox Code Playgroud)
对不起,没有类似于LIKE INmysql的操作.
如果你想在没有连接的情况下使用LIKE运算符,你必须这样做:
(field LIKE value OR field LIKE value OR field LIKE value)
Run Code Online (Sandbox Code Playgroud)
你知道,MySQL不会优化那个查询,仅供参考.
请注意任何尝试 REGEXP 使用“LIKE IN”功能的人。
IN 允许您执行以下操作:
field IN (
'val1',
'val2',
'val3'
)
Run Code Online (Sandbox Code Playgroud)
在 REGEXP 这行不通
REGEXP '
val1$|
val2$|
val3$
'
Run Code Online (Sandbox Code Playgroud)
它必须像这样在一行中:
REGEXP 'val1$|val2$|val3$'
Run Code Online (Sandbox Code Playgroud)