我有一个类似这样的字符串:
`a|b^c|d|e^f|g`
我希望保留使用管道“|”作为分隔符,但删除脱字符“^”作为子分隔符,并仅保留该子分隔符的第一个值。
输出结果应为:
`a|b|d|e|g`
有没有一种简单的SQL函数可以实现这个功能?
我有一个类似这样的字符串:
`a|b^c|d|e^f|g`
我希望保留使用管道“|”作为分隔符,但删除脱字符“^”作为子分隔符,并仅保留该子分隔符的第一个值。
输出结果应为:
`a|b|d|e|g`
另一种选择是使用 CHARINDEX
、REPLACE
和 SUBSTRING
:
DECLARE @OriginalString varchar(50) = 'a|b^c^d^e|f|g'
DECLARE @MyString varchar(50) = @OriginalString
WHILE CHARINDEX('^', @MyString) > 0
BEGIN
SELECT @MyString = REPLACE(@MyString,
SUBSTRING(@MyString,
CHARINDEX('^', @MyString),
CASE WHEN CHARINDEX('|', @MyString, CHARINDEX('^', @MyString)) > 0 THEN
CHARINDEX('|', @MyString, CHARINDEX('^', @MyString)) - CHARINDEX('^', @MyString)
ELSE
LEN(@MyString)
END
)
, '')
END
SELECT @OriginalString As Original, @MyString As Final
输出:
Original Final
a|b^c^d^e|f|g a|b|f|g
这个表达式将替换第一个插入符号到下一个管道符(或字符串末尾)之间的内容。您可以运行循环,直到没有更多的行被更新或在函数内找不到更多的插入符号等。
case
when charindex('^', s) > 0
then stuff(
s,
charindex('^', s),
charindex('|', s + '|', charindex('^', s) + 1) - charindex('^', s),
''
)
else s
end
下面是一个循环结构,您可以用来适应函数定义:
declare @s varchar(30) = 'a|b^c^d|e|f^g|h^i';
declare @n int = charindex('^', @s);
while @n > 0
begin
set @s = stuff(@s, @n, charindex('|', @s + '|', @n + 1) - @n, '');
set @n = charindex('^', @s, @n + 1);
end
select @s;
在最后一个管道分隔符不存在的字符串尾部需要特别注意。你可以看到我已经处理过了。
首先按照|
分隔值,然后提取第一个值并将结果连接起来以获得结果。
试试这个方法
SELECT Cast(left(intr,len(intr)-1) AS VARCHAR(1000)) AS res
FROM (SELECT LEFT(split_val, Isnull(NULLIF(Charindex('^', split_val), 0)-1, Len(split_val))) + '|'
FROM Udf_splitstring('a|bdd^c|d|e^f|g', '|')
FOR xml path (''))a (intr)
结果 : a|bdd|d|e|g
这是一篇关于分割字符串函数的文章Split strings the right way – or the next best way
|xb^dfg|b|f^df|
,那么这个答案会返回 |x|b|f|
,而不是 |xb|b|f|
... - Zohar Peled
a|ab^cd^ef|e^da
的数据? - Lukasz Szozda