SQL从分隔字符串中删除字符

时间:2013-03-25 17:30:03

标签: sql

我有一个以下格式的字符串。我试图在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'S例如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, "")

2 个答案:

答案 0 :(得分:1)

如果我必须在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

答案 1 :(得分:0)

我不认为你可以使用单个表达式来完成它,但创建一个循环的函数应该非常简单,直到记录分隔符|已经​​用完为止。对于每场比赛,找到第一个〜。沿着循环连接字符串的部分。您需要使用在DBMSes中常见的函数locate,substring和concat。我不确定你的问题究竟是什么,但正则表达式不是标准的,至少在mySQL中你不能用它们来代替。