SQL如何将含多日期日志的单条记录拆分为多行?
实现单条记录按日志拆分的SQL方案
针对你的需求,直接用CROSS APPLY配合STRING_SPLIT拆分日志,再通过字符串函数提取日期和内容即可,以下是可行代码:
基础实现(适用于SQL Server 2016+)
假设源表名为CaseLogs,字段为Case_Number和Comment:
SELECT cl.Case_Number, -- 提取日期时间 SUBSTRING(splitted.value, 1, CHARINDEX(' - ', splitted.value) - 1) AS Log_Datetime, -- 提取日志内容 SUBSTRING(splitted.value, CHARINDEX(' - ', splitted.value) + 3, LEN(splitted.value)) AS Log_Content FROM CaseLogs cl CROSS APPLY STRING_SPLIT(cl.Comment, '<br>') splitted WHERE cl.Case_Number = 'INC0112233' -- 如需处理所有记录可移除该条件
兼容格式不固定的场景
如果日志里的「日期时间 - 内容」分隔符前后空格不统一,用PATINDEX替代CHARINDEX更灵活:
SELECT cl.Case_Number, SUBSTRING(splitted.value, 1, PATINDEX('% - %', splitted.value) - 1) AS Log_Datetime, SUBSTRING(splitted.value, PATINDEX('% - %', splitted.value) + 3, LEN(splitted.value)) AS Log_Content FROM CaseLogs cl CROSS APPLY STRING_SPLIT(cl.Comment, '<br>') splitted WHERE cl.Case_Number = 'INC0112233' AND PATINDEX('% - %', splitted.value) > 0 -- 过滤无效格式的日志行
注意事项
STRING_SPLIT仅支持SQL Server 2016及以上版本,旧版本需自行实现自定义字符串拆分函数- 若
Comment字段存在连续<br>或空日志行,可通过WHERE TRIM(splitted.value) <> ''过滤空行
内容的提问来源于stack exchange,提问作者npr932
相关产品推荐
相关产品推荐

