对于给定的搜索字符串 s ,我想从索引的varchar(255)字段(~1m行)中查找值,以便s.startsWith(value)== true。
实施例: s =“你好世界”
匹配:“h”,“hello”,“hello world”
这可能吗?
答案 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%'