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
相关产品推荐
相关产品推荐

