急,急,求SQL代码。

wcqgm 2004-08-27 03:23:06
现有一个表D04,字段如下D0401,D0402,D0403,其中D0403的值存储格式为XX,YY,ZZ,TT。现在有一个字符串,其值为'XX,YY,AA,BB,CC,ZZ',请问如何将不重复的值追加到D0403中,如,其原值为'XX,YY,ZZ,TT',现有的字符串变量的值为'XX,YY,AA,BB,CC,ZZ',得到的新值应为'XX,YY,ZZ,TT,AA,BB,CC'.请各位大虾相助,答案一出,立即给分.谢谢
...全文
192 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
wcqgm 2004-08-27
  • 打赏
  • 举报
回复
感谢各位高手帮助小弟解决这一问题。由于这个问题本身的问题,无法用一条语句搞定,最后pbsql和wanyingsong两位哥哥都写了一个函数,最后我也采纳了他们的意见。50分不多,表表心意,谢谢大家的参与和帮助。谢谢
老宛 2004-08-27
  • 打赏
  • 举报
回复
pbsql(风云)已经写过了呀,呵呵
wcqgm 2004-08-27
  • 打赏
  • 举报
回复
如果没办法,你看能不能写一个比我现在手中更好的函数呵,呵呵,谢谢你了。我会很快OVER的。
老宛 2004-08-27
  • 打赏
  • 举报
回复
那只有用自定义函数了,呵呵,看PBSQL的,我的自定义函数不符合要求
wcqgm 2004-08-27
  • 打赏
  • 举报
回复
to:wanyingsong(豌豆)
我的D0403和另外一个变量的值不是固定的。有可能是'11,xx,33,zz',也有可能是'1,xx,33,zzz',更有可能是'z,TTTT,zz'
老宛 2004-08-27
  • 打赏
  • 举报
回复
--那就这样做
DECLARE @STRING VARCHAR(50),@D0403 VARCHAR(50)
SET @D0403='11,xx,33,zz'

SET @STRING='xx,yy,aa,bb,cc,zz'

SELECT @d0403+replace(replace(replace(replace(','+@string,','+left(@D0403,2),''),substring(@D0403,3,3),''),substring(@D0403,6,3),''),substring(@D0403,9,3),'')

SET @STRING='xx,yy,aa,bb,ff,gg,ee,ii,xy,cc,zz'

SELECT @d0403+replace(replace(replace(replace(','+@string,','+left(@D0403,2),''),substring(@D0403,3,3),''),substring(@D0403,6,3),''),substring(@D0403,9,3),'')
wcqgm 2004-08-27
  • 打赏
  • 举报
回复
不是的,我的D0403的值也只是假设的,它的固式是那种形式的。不好意思。让您误解了。
老宛 2004-08-27
  • 打赏
  • 举报
回复
只要你的D0403的值是'xx,yy,zz,tt'不变,任何变量只要它是以'xx,yy,aa,bb'这种格式的,用我的语句都是可以的呀
DECLARE @STRING VARCHAR(50)
SET @STRING='xx,yy,aa,bb,cc,zz'

SELECT 'xx,yy,zz,tt'+replace(replace(replace(replace(','+@string,',xx',''),',yy',''),',zz',''),',tt','')

SET @STRING='xx,yy,aa,bb,ff,gg,ee,ii,xy,cc,zz'

SELECT 'xx,yy,zz,tt'+replace(replace(replace(replace(','+@string,',xx',''),',yy',''),',zz',''),',tt','')
wcqgm 2004-08-27
  • 打赏
  • 举报
回复
我所指的函数是自定义的函数。
wcqgm 2004-08-27
  • 打赏
  • 举报
回复
最后不要用函数。
wcqgm 2004-08-27
  • 打赏
  • 举报
回复
to: wanyingsong(豌豆)
你写的SQL语句,虽然能得到结果,但是有局限性呀?因为我的变量值不是固定死的,它的值是不能确定的,只不过它的格式是固定的。所以还希望你能不能改进一下。谢谢!
老宛 2004-08-27
  • 打赏
  • 举报
回复
你的D0403如果是固定的'xx,yy,zz,tt'的话,用上面的语句,一条就可以了,如果不是固定的,就用自定义函数:
-- =============================================
-- Create inline function (IF)
-- =============================================
IF EXISTS (SELECT *
FROM sysobjects
WHERE name = N'test')
DROP FUNCTION test
GO

CREATE FUNCTION test(
@string1 varchar(40),
@string2 varchar(40))
RETURNS varchar(40)
AS
begin
declare @table table(string varchar(10))
declare @string varchar(40)
select @string=@string1+','+@string2+','
while len(@string)>=3
begin
insert into @table select left(@string,3)
select @string=right(@string,len(@string)-3)
end
select @string=''
select @string=@string+string from @table group by string
return left(@string,len(@string)-1)
end
GO

select dbo.test('ab,cd,ef','ab,ef,dd,cc')
select dbo.test('xx,yy,zz,tt','xx,yy,aa,bb,cc,zz')
老宛 2004-08-27
  • 打赏
  • 举报
回复
DECLARE @STRING VARCHAR(50)
SET @STRING='xx,yy,aa,bb,cc,zz'
SET @STRING=','+@STRING

SELECT replace(replace(replace(replace(@string,',xx',''),',yy',''),',zz',''),',tt','')

update d04 set D0403=D0403+replace(replace(replace(replace(@string,',xx',''),',yy',''),',zz',''),',tt','')
pbsql 2004-08-27
  • 打赏
  • 举报
回复
--写一函数:
CREATE FUNCTION dbo.f_1(@str1 varchar(8000),@str2 varchar(8000))
RETURNS varchar(8000)
AS
BEGIN
DECLARE @t table(s varchar(100))
DECLARE @s varchar(8000)
SET @s=@str1
WHILE CHARINDEX(',',@s)>0
BEGIN
INSERT INTO @t(s) VALUES(LEFT(@s,CHARINDEX(',',@s)-1))
SET @s=RIGHT(@s,LEN(@s)-CHARINDEX(',',@s))
END
INSERT INTO @t(s) VALUES(@s)
SET @s=@str2
WHILE CHARINDEX(',',@s)>0
BEGIN
IF LEFT(@s,CHARINDEX(',',@s)-1) not in(SELECT s FROM @t)
INSERT INTO @t(s) VALUES(LEFT(@s,CHARINDEX(',',@s)-1))
SET @s=RIGHT(@s,LEN(@s)-CHARINDEX(',',@s))
END
IF @s not in(SELECT s FROM @t)
INSERT INTO @t(s) VALUES(@s)
SET @s=''
SELECT @s=@s+','+s FROM @t
RETURN(right(@s,len(@s)-1))
END
GO
--调用
print dbo.f_1('XX,YY,ZZ,TT','XX,YY,AA,BB,CC,ZZ')
--更新表
update D04 set D0403=dbo.f_1(D0403,'XX,YY,AA,BB,CC,ZZ')
gaodongsheng 2004-08-27
  • 打赏
  • 举报
回复
用一条SQL语句来现实很困难,为什么不能用函数呢?
pisces007 2004-08-27
  • 打赏
  • 举报
回复
1。在前台判断每一个单独的子串是否在里面,然后可以直接更新
2。用function

老宛 2004-08-27
  • 打赏
  • 举报
回复
declare @string1 varchar(50),@string2 varchar(50)
set @string1='xx,yy,zz,tt'
set @string2='xx,yy,aa,bb,cc,zz'

select @string1=@string1+',',@string2=@string2+','
--实现部分
select @string1+left(replace(replace(replace(replace(@string2,'xx,',''),'yy,',''),'zz,',''),'tt,',''),len(replace(replace(replace(replace(@string2,'xx,',''),'yy,',''),'zz,',''),'tt,',''))-1)
wcqgm 2004-08-27
  • 打赏
  • 举报
回复
where 后面的条件呢?
pisces007 2004-08-27
  • 打赏
  • 举报
回复
直接用
update D04 set D0403='XX,YY,AA,BB,CC,ZZ'
where ...
dnvodcwan 2004-08-27
  • 打赏
  • 举报
回复
不是吧, 如果不用函数, 真是很难啊
加载更多回复(4)

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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