这个要如何替换

Mark杨 2010-11-11 05:00:37
select F1 form A
---------
1
3

现在有一个字符串 str = '1,2,3,12,13'
我要根据A查出来的结果 把str中的值去掉

现在A表值为 1 3 那么 str = '2,12,13'

如果A表的值为 3 12 那么 str = '1,2,13'
...全文
89 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2010-11-11
  • 打赏
  • 举报
回复
效率应该还可以,只是使用了函数而已。
Mark杨 2010-11-11
  • 打赏
  • 举报
回复

declare @str nvarchar(20)
set @str = '1;2,3,12,13'
declare @s nvarchar(20)
set @s = ',' + @str + ','

select @s = replace(replace(@s,';',','),','+F1+',',',') from split('1,3',',')
select @s


解决 就是不知道 效率怎么样
「已注销」 2010-11-11
  • 打赏
  • 举报
回复
不同分割符也可以处理
DECLARE @str VARCHAR(100)
SET @str='1,2,3;12;13'----输入你的字符串

;WITH CTE
AS
(
SELECT b.col
FROM (SELECT col=CAST('<v>'+replace(REPLACE(@str,';','</v><v>'),',','</v><v>')+'</v>' AS xml)) a---多个不同字符串在这里处理,可以外层再套一层replace处理就可以了
OUTER APPLY (SELECT col=T.C.value('.','varchar(100)') FROM a.col.nodes('/v') AS T(C)) b
)
SELECT Col=STUFF((SELECT ',' + col FROM CTE C
WHERE c.col not in(select id FROM #tp)
FOR XML PATH('')),1,1,'')
Col
----------------------
2,12,13

(1 row(s) affected)

Mark杨 2010-11-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zsh0809 的回复:]
SQL code
CREATE TABLE #tp
(
id INT
)

INSERT INTO #tp select 1
INSERT INTO #tp select 3

DECLARE @str VARCHAR(10)
SET @str='1,2,3,12,13'----输入你的字符串

;WITH CTE
AS
(
SELECT b……
[/Quote]

我的错 没有写清楚环境
我的SQL为:
sql 2000
「已注销」 2010-11-11
  • 打赏
  • 举报
回复
CREATE TABLE #tp
(
id INT
)

INSERT INTO #tp select 1
INSERT INTO #tp select 3

DECLARE @str VARCHAR(10)
SET @str='1,2,3,12,13'----输入你的字符串

;WITH CTE
AS
(
SELECT b.col
FROM (SELECT col=CAST('<v>'+REPLACE(@str,',','</v><v>')+'</v>' AS xml)) a
OUTER APPLY (SELECT col=T.C.value('.','varchar(50)') FROM a.col.nodes('/v') AS T(C)) b
)

SELECT Col=STUFF((SELECT ',' + col FROM CTE C
WHERE c.col not in(select id FROM #tp)
FOR XML PATH('')),1,1,'')

Col
--------------------------
2,12

(1 row(s) affected)
Mark杨 2010-11-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dawugui 的回复:]
我认为是分解后用not in,然后再合并。
[/Quote]

不过我的那个str字符串中 可能是 '1;2,3;4,5,7,12,13;14'
分开的是;或者,

分隔符 有2种
Mark杨 2010-11-11
  • 打赏
  • 举报
回复
不过我的那个str字符串中 可能是 '1;2,3;4,5,7,12,13;14'
分开的是;或者,


select @s = replace(@s,','+F1+',',',') from split('1,3',',')
select @s = replace(@s,';'+F1+';',',') from split('1,3',',')
select @s = replace(@s,','+F1+';',',') from split('1,3',',')
select @s = replace(@s,';'+F1+',',',') from split('1,3',',')
select @s

这样虽然也可以得到结果 但是这样执行4次 会不会不好啊
Mark杨 2010-11-11
  • 打赏
  • 举报
回复

create function split
(
@SourceSql varchar(8000),
@StrSeprate varchar(10)
)
returns @temp table(F1 varchar(100))
as
begin
declare @i int
set @SourceSql=rtrim(ltrim(@SourceSql))
set @i=charindex(@StrSeprate,@SourceSql)
while @i>=1
begin
insert @temp values(left(@SourceSql,@i-1))
set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
set @i=charindex(@StrSeprate,@SourceSql)
end
if @SourceSql<>''
insert @temp values(@SourceSql)
return
end

select F1 from split('1,3',',')
---结果
F1
---------------
1
3

declare @str nvarchar(20)
set @str = '1,2,3,12,13'
declare @s nvarchar(20)
set @s = ',' + @str + ','

select @s = replace(@s,','+F1+',',',') from split('1,3',',')
select @s


--------------------
,2,12,13,



呵呵 这样应该可以了把
jamk 2010-11-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dawugui 的回复:]
我认为是分解后用not in,然后再合并。
[/Quote]
顶楼上的~
dawugui 2010-11-11
  • 打赏
  • 举报
回复
我认为是分解后用not in,然后再合并。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧