You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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表,执行查询后会得到:

str1str2最长无空格子串
aabcdfbasrikcdfvacdf
aaab akucaaabir aaaab
ab akucab atrab

完全匹配预期结果。

内容的提问来源于stack exchange,提问作者TriniTY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:14:53