如何select两个字符之间的数据

How to select data between two characters

想要来自始终以 * 符号开头并以 *| 结尾的字符串中的 select 数据。例如,它必须适用于两个字符串:232323*123456*123512232323*123456|123512.

我尝试这样解析:

declare @s varchar(max) = '232323*123456*123512'
select parsename(replace(@s, '*', '.'), 2)

但是这个只适用于 232323*123456*123512。 需要也可以与 '232323*123456|123512' 一起使用的解析器。 响应必须针对两个字符串:123456.

在现有 replace 之上使用另一个 Replace 将两个符号替换为 '.'

DECLARE @S VARCHAR(MAX) = '232323*123456|123512'

SELECT Parsename(Replace(Replace(@S, '*', '.'), '|', '.'), 2) --123456

更新: 处理 .. 替换为任何其他符号进行解析,然后最终将符号替换为 .

SELECT replace(Parsename(Replace(Replace(replace(@S,'.','~'), '*', '.'), '|', '.'), 2),'~','.') --12.34.56

一种方法是:

declare @s varchar(max) = '232323*123456|123512'

首先替换所有字符以具有相同的分隔符:

SET @s = REPLACE(@s, '|', '*')

然后 select 在第一次出现的 * 和下一次出现的 * 之间的子串

SELECT SUBSTRING(@s, CHARINDEX('*', @s) + 1, CHARINDEX('*', @s, CHARINDEX('*', @s) + 1) - CHARINDEX('*', @s) - 1)

您可以尝试同时替换“*”和“|”:

declare @s varchar(max) = '232323*123456|123512'
select parsename(replace(replace(@s, '|', '.'), '*', '.'), 2)