如何在SQL中获取两个字符串的最长无空格公共子串?
在SQL中查找两个字符串的最长无空格公共子串
针对你提出的需求,结合给定的初始查询和样本数据,我整理了一套可行的解决方案,一步步来实现:
思路说明
要找出两个字符串的最长无空格公共子串,核心步骤是:
- 为每个字符串生成所有不含空格的连续子串;
- 匹配不同字符串间的公共子串,筛选出长度最大的那个。
因为SQL没有直接内置的最长公共子串函数,我们需要借助递归CTE生成数字序列,来遍历所有可能的子串起始位置和长度。
完整SQL查询
WITH nums AS ( -- 生成1到100的数字序列,覆盖绝大多数字符串长度,可按需调整上限 SELECT 1 AS n UNION ALL SELECT n + 1 FROM nums WHERE n < 100 ), string_substrings AS ( -- 生成每个字符串的所有无空格连续子串 SELECT str, SUBSTRING(str, start.n, len.n) AS substr, len.n AS substr_len FROM tbl CROSS JOIN nums start CROSS JOIN nums len WHERE -- 确保子串不超出原字符串长度 start.n + len.n - 1 <= LENGTH(str) -- 筛选出不含空格的子串 AND SUBSTRING(str, start.n, len.n) NOT LIKE '% %' ), common_substrings AS ( -- 匹配不同字符串间的公共子串 SELECT a.str AS str1, b.str AS str2, a.substr AS common_substr, a.substr_len AS length FROM string_substrings a JOIN string_substrings b ON a.substr = b.substr AND a.str <> b.str -- 排除自身对比 ), ranked_substrings AS ( -- 按字符串对分组,给子串按长度降序排名 SELECT str1, str2, common_substr, length, RANK() OVER (PARTITION BY str1, str2 ORDER BY length DESC) AS rnk FROM common_substrings ) -- 取出每组排名第一的最长子串 SELECT str1, str2, common_substr AS 最长无空格子串 FROM ranked_substrings WHERE rnk = 1 GROUP BY str1, str2, common_substr;
关键细节说明
- 数字序列表(nums):这里生成了1到100的数字,如果你有更长的字符串,需要调整
WHERE n < 100中的上限值,避免漏掉长子串。 - 无空格子串筛选:通过
NOT LIKE '% %'确保生成的子串本身不包含空格,符合需求。 - 排名处理:用
RANK()是为了如果有多个长度相同的最长子串,会全部返回;如果只需要任意一个,可以替换成ROW_NUMBER()。 - 性能提示:这个方法本质是生成所有可能的子串,属于O(n²)复杂度,适合小数据集。如果表数据量很大,可能需要考虑其他优化方式(比如限制子串最小长度,减少不必要的计算)。
验证样本数据
把你的样本数据代入tbl表,执行查询后会得到:
| str1 | str2 | 最长无空格子串 |
|---|---|---|
| aabcdfbas | rikcdfva | cdf |
| aaab akuc | aaabir a | aaab |
| ab akuc | ab atr | ab |
完全匹配预期结果。
内容的提问来源于stack exchange,提问作者TriniTY
相关产品推荐
相关产品推荐

