Si j'ai une valeur quelque chose comme '10, 10,20,30,40,20 'dans un champ de table, alors je veux le faire comme '10, 20,30,40 'Supprimer les doublons de chaîne en utilisant sql
Y at-il une fonction SQL pour faire une telle chose?
Merci Sudhakar
Si j'ai une valeur quelque chose comme '10, 10,20,30,40,20 'dans un champ de table, alors je veux le faire comme '10, 20,30,40 'Supprimer les doublons de chaîne en utilisant sql
Y at-il une fonction SQL pour faire une telle chose?
Merci Sudhakar
a fait cela depuis longtemps. Cela pourrait nécessiter quelques modifications. Mais cela génère une sortie.
Essayez:
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)
utilisant DelimitedSplit8K Jeff de 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
croire stocke nombre entier, vous pouvez les obtenir avec la création d'une fonction d'abord, vous devez diviser les valeurs doivent alors utiliser un fonction distincte comme ci-dessous
1er créer une fonction comme
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
alors appeler la fonction comme
sélectionnez [dbo] .idpGetSplitedString en tant que valeurs
Vous devez regarder autour de vous et trouver un meilleur séparateur. Voici de nombreuses autres alternatives bien meilleures: http://sqlperformance.com/2012/07/t-sql-queries/split-strings Looping n'est pas une bonne chose pour ça: –
son travail –
Bien sûr, il fera la scission, mais il le fait super lent. –
Ne pas stocker plusieurs valeurs dans une seule colonne. Au lieu de les stocker dans des enregistrements distincts dans une table liée. Alors c'est facile avec 'DISTINCT'. Yu a aussi plus de sécurité (type de données correct) et de bien meilleures performances. –
Utilisez la fonction split, puis sélectionnez distinct sur les résultats et mettre dans une chaîne en utilisant l'astuce coalesce – RegBes
Oui mon ami, je le sais. Mais le problème est que c'est un système ancien et que le client ne veut que ça. Il n'est pas prêt à changer le design car il craint que cela puisse affecter d'autres fonctions du système existant Je suis donc obligé d'utiliser le design tel qu'il est maintenant :( –