MS SQL如何提取竖线分隔字符串中的第二个值?
解决SQL提取竖线分隔第二个值的问题
你原语句的问题核心是没搞对SUBSTRING的第三个参数——它要的是截取的长度,不是结束位置。你现在传的是第二个竖线的位置,所以会从第一个竖线后开始,按这个位置数截取字符,自然会带上后面的内容。
直接用下面的修改语句就能精准提取第二个值:
SELECT SUBSTRING( column_name, CHARINDEX('|', column_name) + 1, CHARINDEX('|', column_name, CHARINDEX('|', column_name) + 1) - CHARINDEX('|', column_name) - 1 ) FROM [name].[name].[table_name]
简单说下逻辑:
- 第一个
CHARINDEX('|', column_name)找到第一个竖线的位置,加1就是第二个值的起始点 CHARINDEX('|', column_name, CHARINDEX('|', column_name) + 1)是从第一个竖线的下一位开始找第二个竖线的位置,用这个位置减去第一个竖线的位置再减1,刚好就是两个竖线之间的字符长度,这样SUBSTRING就只会截取中间的目标值
如果你的数据里存在只有1个竖线或者没有竖线的行,怕报错可以加个判断兜底:
SELECT CASE WHEN LEN(column_name) - LEN(REPLACE(column_name, '|', '')) >= 1 THEN SUBSTRING( column_name, CHARINDEX('|', column_name) + 1, CHARINDEX('|', column_name, CHARINDEX('|', column_name) + 1) - CHARINDEX('|', column_name) - 1 ) ELSE NULL -- 这里可以换成你需要的默认值,比如空字符串'' END AS second_value FROM [name].[name].[table_name]
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

