[英]SQL Remove Characters from delimeted string
我有以下格式的字符串。 我試圖在SQL中創建一次性函數以刪除某些字符。
樣本字符串:
Var s = '18160 ~ SCC-Hard Drive ~ 4 ~ d | 18170 ~ SCC-SSD ~ 4 ~ de | 18180 ~ SCC-Monitor ~ 5 ~ | 18190 ~ SCC-Keyboard ~ null ~'
預期結果:
s = 'SCC-Hard Drive ~ 4 ~ d | SCC-SSD ~ 4 ~ de | SCC-Monitor ~ 5 ~
|SCC-Keyboard ~ null ~'
如果您在ID上方注意到,例如18160、18170、18180和18190被刪除。 這僅是示例。 結構如下:
id: 18160
description : SCC-Hard Drive
Type: 4
comment: d
因此,在有多個項目的情況下,它們會使用派克(Pike)分度計進行級聯。 所以我的要求是從上述結構的給定字符串中刪除ID。
在Javascript中,我知道我可以使用正則表達式並執行以下操作,並且可以正常工作,只需要在SQL 08中執行
s.replace(/\d{5}\s~\s/g, "")
如果必須在SQL中執行,我喜歡為此使用CHARINDEX
。 不過,如果可以幫助,我會盡量避免將SQL用於此類字符串操作。
這樣的事情應該起作用:
DECLARE @s VARCHAR(2500), @result VARCHAR(2500), @tilde INT, @pipe INT, @length INT, @calc INT
SELECT @s = '18160 ~ SCC-Hard Drive ~ 4 ~ d | 18170 ~ SCC-SSD ~ 4 ~ de | 18180 ~ SCC-Monitor ~ 5 ~ | 18190 ~ SCC-Keyboard ~ null ~'
SELECT @length = LEN(@s)
SELECT @tilde = PATINDEX('% ~%', @s);
SELECT @pipe = PATINDEX('% | %', @s);
--If there's no tilde, then there's only one element
IF (@tilde = 0 OR @length = 0)
BEGIN
SELECT @s;
RETURN;
END
--If no pipe, there's only one set
ELSE IF @pipe = 0
BEGIN
SELECT REPLACE(@s, SUBSTRING(@s, 0, @tilde +3), '')
RETURN;
END
ELSE
BEGIN
--clear first id
SELECT @s = REPLACE(@s, SUBSTRING(@s, 0, @tilde +3), '')
SELECT @pipe = CHARINDEX('|', @s)
SELECT @tilde = CHARINDEX('~', @s, @pipe +1);
WHILE @pipe > 0
BEGIN
SELECT @calc = (@tilde - @pipe)
SELECT @s = REPLACE(@s, SUBSTRING(@s, @pipe + 1, @calc), '')
SELECT @pipe = CHARINDEX('|', @s, @pipe +1)
SELECT @tilde = CHARINDEX('~', @s, @pipe +1);
END
SELECT @s
END
我認為您不能使用單個表達式來完成此操作,但是創建一個循環直到記錄分隔符|用盡的函數應該很簡單。 對於每個匹配項,找到第一個〜。 沿着循環連接字符串的各個部分。 您需要使用在DBMS中常見的函數locate,substring和concat。 我不確定您到底是什么問題,但是正則表達式不是標准的,至少在mySQL中,您不能使用它們進行替換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.