0

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

2 回答 2

1

CHARINDEX如果我必须在 SQL 中执行此操作,我喜欢使用它。不过,如果我能提供帮助,我会尽量避免使用 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
于 2013-03-25T18:38:24.030 回答
0

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

于 2013-03-25T18:44:53.950 回答