如何从nvarchar类型字符串的特定字符间提取姓名、手机号等目标文本
正确实现方案
你现有的写法仅匹配了字符串中第一个-的位置,没有定位到姓名、手机号对应的专属特征标识,因此无法得到正确结果。针对你提供的样本字符串,推荐使用固定语义标识定位的方案,稳定性更强:
方案1:通过结构化字段标识提取(推荐)
样本后半段有固定的User ID:、Name:、Dept:标识,直接基于这些标识截取内容即可:
SELECT -- 提取姓名:取User ID:和Name:之间的内容,去除首尾空格 LTRIM(RTRIM(SUBSTRING( col, CHARINDEX('User ID:', col) + LEN('User ID:'), CHARINDEX('Name:', col) - CHARINDEX('User ID:', col) - LEN('User ID:') ))) AS Name, -- 提取手机号:取Name:和Dept:之间的内容,去除首尾空格 LTRIM(RTRIM(SUBSTRING( col, CHARINDEX('Name:', col) + LEN('Name:'), CHARINDEX('Dept:', col) - CHARINDEX('Name:', col) - LEN('Name:') ))) AS [Phone Number] FROM 你的业务表名
方案2:通过分隔符结构提取
如果要基于前半段822-姓名-手机号--的分隔符结构提取,可使用以下写法:
SELECT PARSENAME(REPLACE(SUBSTRING( col, CHARINDEX(',822-', col) + 1, CHARINDEX('--', col, CHARINDEX(',822-', col)) - CHARINDEX(',822-', col) -1 ), '-', '.'), 2) AS Name, PARSENAME(REPLACE(SUBSTRING( col, CHARINDEX(',822-', col) + 1, CHARINDEX('--', col, CHARINDEX(',822-', col)) - CHARINDEX(',822-', col) -1 ), '-', '.'), 1) AS [Phone Number] FROM 你的业务表名
运行结果
两种方案执行后均可得到目标输出:
| Name | Phone Number |
|---|---|
| FName | 18001233321 |
注:你示例中的手机号少写了一位数字,若需要截断为9位可在手机号外层加
LEFT(xxx,9)处理。
内容的提问来源于stack exchange,提问作者bloomerv
相关产品推荐
相关产品推荐

