簡體   English   中英

SQL從變數字符串中刪除字符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM