查找SearchString

时间:2016-04-16 10:59:58

标签: mysql sql

对于给定的搜索字符串 s ,我想从索引的varchar(255)字段(~1m行)中查找值,以便s.startsWith(value)== true。

实施例: s =“你好世界”

匹配:“h”,“hello”,“hello world”

这可能吗?

3 个答案:

答案 0 :(得分:1)

你可以使用INSTR与大多数情况下相反的参数:

SELECT *
FROM   mytable
WHERE  INSTR('hello world', mycol) = 1

这将返回 mycol 从位置1开始具有“hello world”子字符串的记录。因此,以下任何一项都将匹配:

  

ħ
  他
  HEL
  地狱
  你好
  你好(有尾随空间)
  你好w
  你好我   你好   你好世界   你好世界

通过添加以下冗余条件,您可能会获得更好的性能,这可能暗示SQL引擎在mycol上选择索引:

SELECT *
FROM   mytable
WHERE  INSTR('hello world', mycol) = 1
AND    mycol like 'h%'

请注意,即使使用索引,也不能保证更快的输出。想象一个带有值的表:

  

HEL
  helaaaaaaa
  helaaaaaab
  helaaaaaac
  ...(1000多条记录,最后:)   你好世界

...然后引擎仍然会扫描所有记录,只得到第一个和最后一个。

如果您有一个执行此查询的应用程序,您可以让它动态构建SQL,以便它看起来像这样:

SELECT *
FROM   mytable
WHERE  mycol IN ('h', 'he', 'hel', 'hell', 'hello', 'hello ', 'hello w', 
                 'hello wo', 'hello wor', 'hello worl', 'hello world')

这可能是最好的表现。如果不这样做,那么这个精心设计的SQL肯定会这样做:

SELECT * FROM mytable WHERE mycol = 'h'
UNION ALL
SELECT * FROM mytable WHERE mycol = 'he'
UNION ALL
SELECT * FROM mytable WHERE mycol = 'hel'
UNION ALL
SELECT * FROM mytable WHERE mycol = 'hell'
UNION ALL
SELECT * FROM mytable WHERE mycol = 'hello'
UNION ALL
SELECT * FROM mytable WHERE mycol = 'hello '
UNION ALL
SELECT * FROM mytable WHERE mycol = 'hello w'
UNION ALL
SELECT * FROM mytable WHERE mycol = 'hello wo'
UNION ALL
SELECT * FROM mytable WHERE mycol = 'hello wor'
UNION ALL
SELECT * FROM mytable WHERE mycol = 'hello worl'
UNION ALL
SELECT * FROM mytable WHERE mycol = 'hello world'

答案 1 :(得分:0)

您想使用like

where col like 'hello%' -- or whatever

where col like concat(@s, '%')

使用like的原因是它可以使用索引,因为模式不以通配符开头。

编辑:

我可能有倒退的逻辑。如果是这样,您仍然可以使用:

where @s like concat(col, '%')

但是,在这种情况下,不能使用索引,因为该列是函数的参数。

答案 2 :(得分:0)

你可以在sql中使用“like”。

  

从tableName中选择*   其中columnName类似'h%'