如果我在表中有一個類似於'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
是的,我知道這是我的朋友。但問題在於它是老舊系統,客戶只希望這樣。他還沒有準備好改變設計,因爲他擔心可能會影響遺留系統的其他功能 因此,我被迫按照現在的方式使用設計:( –