2013-05-10 3 views
2

--- Я пошел с ответом Андрея Гуринова, потому что хотел сделать это в запросе, и он отправил его первым. ----SQL удаляет часть строки

У меня есть база данных с именами, адресами, городами, штатами, почтовыми индексами и т.д. для людей. Я хочу прочитать данные в программе C# в порядке кода группы, имени, а затем даты. Я столкнулся с проблемой, потому что имя было введено несколькими людьми людьми.

Вот пример задачи с подмножеством данных:

| 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 

Как вы можете видеть, имя relativly такой же, но порядок дат не то, что я хочу. Я хочу, чтобы даты были в порядке.

Если я прочитал эти данные в своей программе на C#, то есть способ сделать инструкцию выбора распознать варианты (Dr., MS, Ms., Ms, "" < - двойное пространство) и заменить их ничем или единое пространство? Поэтому я могу сортировать группы имен по дате. Или мне нужно будет удалить изменения в базе данных.

----- EDIT (SQL Query) -----

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

    ORder by [OrderCode],[Name], [Date] 

Пример вывода:

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

OrderCode не является уникальным для человека, это уникальный по адресу где в адресе может быть несколько человек.

+0

Почему бы не использовать comboBox, который содержит варианты (Dr., MS, Ms., Ms ..), а затем отсортировать их по дате – Obama

+0

Что это за колонка? '00005573' Если это идентификатор человека или что-то в этом роде, тогда это будет легко. –

+0

Можете ли вы поделиться своим SQL-запросом? Есть ли у него предложение ORDER BY? – HABO

ответ

1

Вы можете попробовать что-то вроде этого:

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

Вы можете написать небольшую процедуру «имя чистой» в C#, что лишит эти элементы, а затем отсортировать список по этой раздела версию, а затем по дате , Вы также можете выполнить это в стороне запроса sql серией вложенных замен. Наконец, как вы упомянули, вы можете попытаться очистить записи в базе данных (возможно, создав другое поле для очищенного имени).

Какой метод вы выберете, будет определяться тем, сколько данных вы имеете в виду, и как часто вам нужно делать что-то подобное. Если это много данных, и вы можете увидеть это в других будущих приложениях, я бы рекомендовал обработать это на уровне базы данных. Вы можете написать функцию в SQL, которая форматирует имена, а затем решить, хотите ли вы использовать ее во время запроса или при вставке данных.

Функция может выглядеть примерно так:

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 = ltrim(@Name) 

    RETURN @Name 
END 

И тогда ваш запрос будет выглядеть следующим образом

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] 
+0

Итак, когда вы говорите «используйте его во время запроса», что бы все это выглядело, когда я делаю свой запрос в своей программе на C#? –

+0

Я обновил ответ на обновленный запрос с помощью функции. Возможно, мне захочется немного исправить эту функцию, поскольку в настоящее время она имеет потенциал для неправильного обновления имен, которые заканчиваются на «mr» или «ms». – Nate

+0

Я обновил функцию, поскольку я был не очень доволен своей первой попыткой. Не стесняйтесь очищать его немного, так как я не уверен, что производительность будет такой хорошей, как есть, но она должна по крайней мере указывать вам в правильном направлении – Nate

0

вы могли бы использовать C#, чтобы очистить имя как так:

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