反转LIKE%...%可能吗?

时间:2014-03-20 13:36:45

标签: mysql

简而言之,我希望将字典条目与一行文本匹配,但它不必匹配整行,只是开头。所以它实际上是一种反向LIKE%...%

例如,

SELECT * FROM `dictionary` WHERE
    (`simplified` = '铅笔的历史非常悠久,它起源于2000多年'
    OR `simplified` = '铅笔的历史非常悠久,它起源于2000多'
    OR `simplified` = '铅笔的历史非常悠久,它起源于2000'
    OR `simplified` = '铅笔的历史非常悠久,它起源于200'
    OR `simplified` = '铅笔的历史非常悠久,它起源于20'
    OR `simplified` = '铅笔的历史非常悠久,它起源于2'
    OR `simplified` = '铅笔的历史非常悠久,它起源于'
    OR `simplified` = '铅笔的历史非常悠久,它起源'
    OR `simplified` = '铅笔的历史非常悠久,它起'
    OR `simplified` = '铅笔的历史非常悠久,它'
    OR `simplified` = '铅笔的历史非常悠久,'
    OR `simplified` = '铅笔的历史非常悠久'
    OR `simplified` = '铅笔的历史非常悠'
    OR `simplified` = '铅笔的历史非常'
    OR `simplified` = '铅笔的历史非'
    OR `simplified` = '铅笔的历史'
    OR `simplified` = '铅笔的历'
    OR `simplified` = '铅笔的'
    OR `simplified` = '铅笔'
    OR `simplified` = '铅')
    ORDER BY CHAR_LENGTH(`simplified`) DESC;

这可行并且做我需要的但是我知道它非常低效。这样做还有其他办法吗?非常感谢!!

示例结果:

97576   铅笔
97484   铅
97566   铅

3 个答案:

答案 0 :(得分:6)

怎么样

WHERE `simplified` = SUBSTRING(
  '铅笔的历史非常悠久,它起源于2000多年',
  0, CHAR_LENGTH(`simplified`))

?可能不可索引,但至少查询很短。 :)

你可以通过添加

来优化它
AND `simplified` LIKE '铅%'

拒绝所有至少不以正确字符开头的行。

答案 1 :(得分:1)

尝试这样:

SELECT * FROM `dictionary` WHERE simplified like '铅%'

答案 2 :(得分:0)

您可以尝试REGEXP将字段与正则表达式匹配。

Official Documentation