我有一个以下格式的字符串。我试图在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, "")
答案 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中你不能用它们来代替。