c# - 基于子串匹配长度的高效 SQL 桶排序

标签 c# sql bucket-sort

给定包含按字母顺序索引的字符串的 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

请注意,我们只关心匹配的子串的长度。落入每个桶的匹配项不必按字母顺序排序,我只关心它们落入的桶

所以我天真地猜测问题涉及:

  1. 查看每行的子串长度与我的输入相匹配
  2. 根据匹配长度将每一行放入适当的桶
  3. 按降序排列桶,即(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

demo

关于c# - 基于子串匹配长度的高效 SQL 桶排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20275787/

相关文章:

c# - C# 中作为 Func 的操作

c# - 无法连续发送三个或更多数据包

c# - 将类转换为数组

sql - Oracle中是否需要 'as'关键字来定义别名?

sorting - 我什么时候应该选择桶排序而不是其他排序算法?

python - 这个桶排序实现在做什么?

c# - 在 GTK# Image Widget 中显示动画 GIF

sql - 如果发生 NULL,Where 子句拒绝行

MySQL选择具有唯一属性值的一行

algorithm - 为什么桶排序在输入排序后运行得更快?