想要从字符串中选择数据,该数据始终以*
符号开头,以*
或|
结尾。例如,它必须适用于两个字符串:232323*123456*123512
和232323*123456|123512
。
我尝试像这样解析:
declare @s varchar(max) = '232323*123456*123512'
select parsename(replace(@s, '*', '.'), 2)
但这只适用于232323*123456*123512
。
需要解析器,它也适用于'232323*123456|123512'
。
响应必须是两个字符串:123456
。
答案 0 :(得分:1)
在现有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
答案 1 :(得分:1)
您可以尝试替换'*'和'|':
declare @s varchar(max) = '232323*123456|123512'
select parsename(replace(replace(@s, '|', '.'), '*', '.'), 2)
答案 2 :(得分:0)
这样做的一种方法是:
declare @s varchar(max) = '232323*123456|123512'
首先替换所有字符以使其具有相同的分隔符:
SET @s = REPLACE(@s, '|', '*')
然后在第一次出现*
和下次出现*
之间选择子字符串
SELECT SUBSTRING(@s, CHARINDEX('*', @s) + 1, CHARINDEX('*', @s, CHARINDEX('*', @s) + 1) - CHARINDEX('*', @s) - 1)