给定一个包含按字母顺序索引的字符串的SQL数据库表,我如何执行按子字符串匹配排序的搜索查询?
例如,给定数据集:
bad
banana
bandana
banker
bed
brother
和搜索字符串band
,我希望结果排序如下
bandana (index 0-3 matched)
banana (index 0-2 matched)
banker
bad (index 0-1 matched)
bed (index 0 matched)
brother
请注意,我们只关心匹配的子字符串的长度。每个存储桶中的匹配项不必按字母顺序排序,我只关心它们属于哪个存储桶。
所以我天真地认为问题涉及:
- 看到子字符串的长度与我每行的输入相匹配
- 根据匹配长度将每一行放入适当的桶中
- 按降序排列存储桶,即(匹配4个字符,匹配3个字符,2..)
但这听起来很昂贵,那么我如何在SQL或C#中实现它,并有效地做到这一点呢?
有没有类似的问题/模式我可以从中受益?
非常感谢
不确定这是否是最有效的方法,但是。
使用数字表,将字符串拆分为字符,并将其连接到搜索字符串的拆分中,然后只按计数和字符串排序。
DECLARE @t TABLE ( string VARCHAR(50) )
INSERT INTO @t (string)
VALUES
('bad'),
('banana'),
('bandana'),
('banker'),
('bed'),
('brother')
DECLARE @search VARCHAR(50) = 'band'
;WITH numbers AS
(
SELECT TOP 10000 ROW_NUMBER() OVER(ORDER BY t1.number) AS n
FROM master..spt_values t1
CROSS JOIN master..spt_values t2
)
SELECT string
FROM @t t
CROSS APPLY (
SELECT SUBSTRING(t.string, numbers.n, 1) c, n
FROM numbers
WHERE numbers.n <= LEN(string)
) s1
JOIN (
SELECT SUBSTRING(@search, numbers.n, 1) c, n
FROM numbers
WHERE numbers.n <= LEN(@search)
) s2 ON s2.c = s1.c
AND s2.n = s1.n
GROUP BY string
ORDER BY COUNT(1) DESC, string
演示
字符串操作和sql server不是最匹配的afaik。
我最好的选择是尝试一个改进版的Bayer-Moore horspool来找到匹配字符的数量。然而,在未命中的情况下,您不会跳过完整的单词长度,只跳过最大匹配的长度。然后简单地插入通知桶。