MySQL LIKE IN()?

Mic*_*les 255 mysql sql

我当前的查询如下所示:

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)

  • 我的表中有超过100万行.REGEX arround 0.0009和LIKE arround 0.0005.如果超过5 REGEX,则为0.0012 ... (50认同)
  • 我有一个问题,`REGEXP`非常慢,但我需要REGEXP的灵活性来缩小我的结果集,而不是像`LIKE'那样.我提出了一个混合解决方案,我使用了`LIKE`和`REGEXP`; 尽管`REGEXP`部分足以给我正确的结果,但使用`LIKE`以及允许MySQL在必须使用较慢的`REGEXP`标准之前大大减少结果集. (10认同)
  • 添加到性能数据.在具有229M行的表中的MySql 5.5上,1个术语左侧锚定3个char搜索:REGEXP:16s,LIKE:8.5s; 2个术语:REGEXP:22.1s,LIKE:9.69; '^(血红蛋白| hematr?ocrit).*'vs 3 term like:REGEXP:36.3,LIKE:9.59. (5认同)
  • 有人在更大的数据集上对此进行基准测试吗? (4认同)
  • 我喜欢这个答案 - 快速,简单,在我想要的一行中获得所有"选项"(易于编辑).在我定位的小结果集上,根本没有降低性能. (2认同)
  • 要从列中获取正则表达式值:`(select group_concat(myColumn separator '|') from..)` (2认同)

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)

  • +1,直到现在才理解JOIN语句. (2认同)

use*_*379 12

Regexp方式与值列表

SELECT * FROM table WHERE field regexp concat_ws("|",
"111",
"222",
"333");
Run Code Online (Sandbox Code Playgroud)


gah*_*ooa 7

对不起,没有类似于LIKE INmysql的操作.

如果你想在没有连接的情况下使用LIKE运算符,你必须这样做:

(field LIKE value OR field LIKE value OR field LIKE value)
Run Code Online (Sandbox Code Playgroud)

你知道,MySQL不会优化那个查询,仅供参考.


Sha*_*kir 6

请注意任何尝试 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)