[英]SQL Remove string between two characters
我有一個這樣的字符串:
`a|b^c|d|e^f|g`
我想保持管道分隔,但刪除胡蘿卜子分隔,只保留該子分隔符的第一個值。
輸出結果將是:
`a|b|d|e|g`
有沒有辦法用簡單的SQL函數做到這一點?
另一個選項,使用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
這是一篇關於拆分字符串函數的文章以正確的方式拆分字符串 - 或者是下一個最好的方法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.