如何在T-SQL中提取'Eaten by:'后的指定人名内容?
T-SQL提取'Eaten by:'后的人名
解决方案
利用字符串中固定的分界标记(人名后紧跟 Location),结合CHARINDEX和SUBSTRING精准提取目标内容:
-- 测试示例1 DECLARE @string1 NVARCHAR(MAX) = 'Apple: Two days Pear: Three days Banana: One day Eaten by: Smith, John Location 1: First Street Location 2: Second Street' -- 测试示例2 DECLARE @string2 NVARCHAR(MAX) = 'Pear: Three days Banana: One day Eaten by: Bloggs, Joe Location 1: First Street Location 2: Second Street Location 3: Third Street' -- 提取逻辑 SELECT SUBSTRING( @string1, CHARINDEX('Eaten by:', @string1) + LEN('Eaten by: '), CHARINDEX(' Location', @string1) - (CHARINDEX('Eaten by:', @string1) + LEN('Eaten by: ')) ) AS PersonName1, SUBSTRING( @string2, CHARINDEX('Eaten by:', @string2) + LEN('Eaten by: '), CHARINDEX(' Location', @string2) - (CHARINDEX('Eaten by:', @string2) + LEN('Eaten by: ')) ) AS PersonName2
代码说明
- 定位人名起始位置:
CHARINDEX('Eaten by:', @string)找到标记的起始点,加上LEN('Eaten by: ')(包含标记后的空格),得到人名第一个字符的位置。 - 定位人名结束位置:
CHARINDEX(' Location', @string)找到人名后固定的分界标记Location的起始点,减去人名起始位置,得到人名的长度。 - 提取目标内容:通过
SUBSTRING截取指定区间的字符串,精准获取人名。
原有代码失效原因
你之前的代码通过查找空格确定人名长度,但人名本身包含空格(如Smith, John中的逗号后空格),导致CHARINDEX无法正确识别人名的结束位置,进而提取了多余内容。利用固定的后续标记 Location作为分界点,更符合你描述的“格式间距一致”规则,结果更可靠。
内容的提问来源于stack exchange,提问作者Paulo
相关产品推荐
相关产品推荐

