如果我在表中有一个类似于'10,10,20,30,40,20'的值,那么我想使它成为'10,20,30,40,40 '使用sql从字符串中删除重复项
有没有什么sql函数可以做这样的事情?
感谢 Sudhakar
如果我在表中有一个类似于'10,10,20,30,40,20'的值,那么我想使它成为'10,20,30,40,40 '使用sql从字符串中删除重复项
有没有什么sql函数可以做这样的事情?
感谢 Sudhakar
这篇很久以前。这可能需要一些修改。但它会产生输出。
尝试:用杰夫的DelimitedSplit8K
DECLARE @Data_String AS VARCHAR(1000), @Result as varchar(1000)=''
SET @Data_String = '10,10,20,30,40,20'
SET @Data_String = REPLACE(@Data_String,'|',',')
select @Data_String;
SELECT @[email protected]+col+',' from(
SELECT DISTINCT t.c.value('.','varchar(100)') col from(
SELECT cast('<A>'+replace(@Data_String,',','</A><A>')+'</A>' as xml)col1)data
cross apply col1.nodes('/A') as t(c))Data
SELECT LEFT(@Result,LEN(@Result)-1)
从http://www.sqlservercentral.com/articles/Tally+Table/72993/
declare @value varchar(100) = '10,10,20,30,40,20',
@new_value varchar(100)
select @new_value = isnull(@new_value + ',', '') + Item
from DelimitedSplit8K(@value, ',')
group by Item
order by Item
select @new_value
相信它存储整数你可以先创建一个功能,你需要分割的数值让他们则必须使用不同功能如下
第一个创建功能,如
CREATE FUNCTION [dbo].[idpGetSplitedString]
(
@String varchar(8000),
@Delimiter char(1)
)
RETURNS
@temptable TABLE
(
items varchar(8000)
)
AS
BEGIN
declare @idx int
declare @slice varchar(8000)
select @idx = 1
if len(@String)<1 or @String is null return
while @idx!= 0
begin
set @idx = charindex(@Delimiter,@String)
if @idx!=0
set @slice = left(@String,@idx - 1)
else
set @slice = @String
if(len(@slice)>0)
insert into @temptable(Items) values(rtrim(ltrim(@slice)))
set @String = right(@String,len(@String) - @idx)
if len(@String) = 0 break
end
RETURN
END
然后调用等
功能中选择[DBO] .idpGetSplitedString作为值
你需要环顾四周,找到一个更好的分离器。很好的例子。这里有很多其他更好的选择。http://sqlperformance.com/2012/07/t-sql-queries/split-strings循环不是一个好的。 –
任何为此?它的工作 –
当然,它会做分裂,但它超慢。 –
多个值不存储在单个列中。而应将其存储在相关表格中的单独记录中。然后用'DISTINCT'很容易。余也有更多的安全(正确的数据类型)和更好的性能。 –
使用分割功能,然后选择截然不同的结果,并使用合并技巧放入字符串 – RegBes
是的,我知道这是我的朋友。但问题在于它是老旧系统,客户只希望这样。他还没有准备好改变设计,因为他担心可能会影响遗留系统的其他功能 因此,我被迫按照现在的方式使用设计:( –