2017-10-13 6 views
0

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

+1

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. –

+0

Utilisez la fonction split, puis sélectionnez distinct sur les résultats et mettre dans une chaîne en utilisant l'astuce coalesce – RegBes

+0

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 :( –

Répondre

1

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) 
0

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

+1

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: –

+0

son travail –

+0

Bien sûr, il fera la scission, mais il le fait super lent. –