SQL supprimer une partie de la string

— Je suis allé avec une version de la réponse d'Andrey Gurinov parce que je voulais faire dans la requête et il l'a posté en premier. —-

J'ai une database avec les noms, adresses, ville, état, zip, ect. pour les personnes. Je veux lire datatables dans un programme C # dans l'ordre d'un code de groupe, nom, puis une date. Je rencontre un problème parce qu'un nom a été saisi de plusieurs façons par des personnes.

Voici un exemple du problème avec un sous-set de données:

| Dr. Kristen S | 2011-04-15 00:00:00.000 | 00005573 | Kristen S | 2012-04-11 00:00:00.000 | 00005573 | Kristen S | 2012-08-10 00:00:00.000 | 00005573 | Ms Kristen S | 2011-08-12 00:00:00.000 | 00005573 | MS Kristen S | 2012-01-27 00:00:00.000 | 00005573 | Ms. KRISTEN S | 2012-04-09 00:00:00.000 | 00005573 

Comme vous pouvez le voir, le nom est relativly le même mais l'ordre des dates n'est pas ce que je veux. Je veux les dates dans l'ordre.

Si je lis ces données dans mon programme C #, y a-t-il un moyen de faire en sorte que l'instruction select reconnaisse les variations (Dr., MS, Ms., Ms, "" <- double espace) et les remplace par rien ou un espace? Alors que je peux ensuite sortinger les groupes de noms par date. Ou aurais-je dois supprimer les variations permenately dans la database.

—– EDIT (requête SQL) —–

 SELECT [ListMP] ,[Name] ,[Address1] ,[City] ,[State] ,[ZipCode] ,[Date] ,[OrderCode] ,[SequenceNbr] FROM [Customer].[dbo].[Orders] ORder by [OrderCode],[Name], [Date] 

Sortie de l'échantillon:

 ORDER |Kristen S| 203 My Street| Bristol| RI| 02809| 2012-04-11 00:00:00.000| 05632| 00005573 

Le OrderCode n'est pas unique à un individu, il est unique à une adresse où l'adresse peut avoir plusieurs personnes.

Vous pouvez essayer quelque chose comme ceci:

 SELECT REPLACE(REPLACE(REPLACE(name, 'Dr.', ''), 'Ms', ''), ' ', ' ') FROM ... 

Vous pourriez écrire une petite procédure "nettoyeur de nom" dans c # qui dépouillerait ces éléments, puis sortinger la list par cette version dépouillée et ensuite par la date. Vous pouvez également effectuer cela dans le côté de la requête sql par une série de rlocations nesteds. Enfin, comme vous l'avez mentionné, vous pouvez essayer de nettoyer les inputs dans la database (éventuellement en créant un autre champ pour le nom nettoyé).

La méthode que vous choisissez sera déterminée par la quantité de données que vous traitez et par la fréquence à laquelle vous devez faire quelque chose comme ça. S'il s'agit de beaucoup de données, et que vous pouvez en avoir besoin dans d'autres applications futures, je vous recommand de gérer cela au niveau de la database. Vous pouvez écrire une fonction dans SQL qui formate les noms, puis décider si vous souhaitez l'utiliser au moment de la requête ou lors de l'insertion des données.

La fonction peut ressembler à ceci:

 drop function [fn_formatName] go CREATE FUNCTION [dbo].[fn_formatName] ( @Name nvarchar(4000) ) RETURNS nvarchar(4000) AS BEGIN set @Name = replace(@Name, '.', '') set @Name = replace(@Name, ' ', ' ') if(len(@name) > 4) begin set @Name = replace(Left(@Name, 4), 'Mrs ', '') + Right(@Name, Len(@Name) - 4) end if(len(@name) > 4) begin set @Name = replace(Left(@Name, 4), 'Dr ', '') + Right(@Name, Len(@Name) - 4) end if(len(@name) > 4) begin set @Name = replace(Left(@Name, 4), 'Mr ', '') + Right(@Name, Len(@Name) - 4) end if(len(@name) > 4) begin set @Name = replace(Left(@Name, 4), 'Ms ', '') + Right(@Name, Len(@Name) - 4) end set @Name = lsortingm(@Name) RETURN @Name END 

Et puis votre requête ressemblerait à ceci

 SELECT [ListMP] ,[Name] ,dbo.fn_formatName([Name]) as 'CleanName', ,[Address1] ,[City] ,[State] ,[ZipCode] ,[Date] ,[OrderCode] ,[SequenceNbr] FROM [Customer].[dbo].[Orders] ORder by [OrderCode], CleanName, [Date] 

vous pouvez utiliser c # pour nettoyer le nom comme ceci:

 ssortingng FixedName(ssortingng name) { name = name.Trim(); var prefixes = new ssortingng[] { "Mrs. ", "Mrs ", "Mr. ", "Mr ", "Dr. ", "Dr " }; foreach (var prefix in prefixes) { if (name.StartsWith(prefix, true, CultureInfo.InvariantCulture)) { name = name.Subssortingng(prefix.Length).Trim(); break; } } return name; }