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

SQL单单元格存多行数据时使用substring截取指定第2行的问题

SQL提取单元格内第2行文本的实现方案

你当前写法的问题是仅定位了第一个换行符的位置作为截取起点,没有定位第二个换行符的位置作为截取终点,所以会返回第一行之后的全部内容。

以下是基于SUBSTRING+CHARINDEX的实现代码(适配SQL Server,其他数据库可替换对应字符串查找函数):

SUBSTRING(
    tbart.artdiscirption,
    -- 第2行起始位置:第一个换行符的下一位
    CHARINDEX(CHAR(10), tbart.artdiscirption) + 1,
    -- 第2行长度:第二个换行符位置 - 第一个换行符位置 - 1
    CHARINDEX(CHAR(10), tbart.artdiscirption, CHARINDEX(CHAR(10), tbart.artdiscirption) + 1) 
    - CHARINDEX(CHAR(10), tbart.artdiscirption) 
    - 1
) AS short_article

注意:如果你的数据库存储的是Windows格式换行(回车+换行),将代码中的CHAR(10)替换为CHAR(13)+CHAR(10)即可。

如果需要兼容内容不足2行的异常场景,可使用带判断的写法:

CASE 
    -- 无换行,不存在第2行,可按需调整返回值为NULL或原内容
    WHEN CHARINDEX(CHAR(10), tbart.artdiscirption) = 0 THEN ''
    -- 仅存在1个换行,内容总共只有2行,直接取第一行之后的全部内容
    WHEN CHARINDEX(CHAR(10), tbart.artdiscirption, CHARINDEX(CHAR(10), tbart.artdiscirption)+1) = 0 
        THEN SUBSTRING(tbart.artdiscirption, CHARINDEX(CHAR(10), tbart.artdiscirption)+1, LEN(tbart.artdiscirption))
    -- 正常3行及以上内容,截取两个换行之间的第2行
    ELSE SUBSTRING(
        tbart.artdiscirption, 
        CHARINDEX(CHAR(10), tbart.artdiscirption)+1, 
        CHARINDEX(CHAR(10), tbart.artdiscirption, CHARINDEX(CHAR(10), tbart.artdiscirption)+1) - CHARINDEX(CHAR(10), tbart.artdiscirption) -1
    )
END AS short_article

其他数据库适配替换规则:

  • MySQL:将CHARINDEX(查找内容, 源字符串, 起始位置)替换为LOCATE(查找内容, 源字符串, 起始位置)
  • PostgreSQL:将CHARINDEX替换为STRPOS,查找起始位置可通过截取子串间接实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:15:04