2

---我选择了 Andrey Gurinov 的答案版本,因为我想在查询中做,他先发布了。----

我有一个包含姓名、地址、城市、州、邮编等的数据库。为人。我想按组代码、名称和日期的顺序将数据读入 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

如您所见,名称相对相同,但日期顺序不是我想要的。我要按顺序排列日期。

如果我将这些数据读入我的 C# 程序,有没有办法让 select 语句识别变化( Dr. 、 MS 、 Ms. 、 Ms 、 " " <- 双空格)并用空或单个空格替换它们?这样我就可以按日期对名称组进行排序。或者我是否必须永久删除数据库中的变化。

----- 编辑(SQL 查询) -----

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不是个人独有的,它对于一个地址可以有多个人的地址是唯一的。

4

3 回答 3

1

你可以尝试这样的事情:

SELECT REPLACE(REPLACE(REPLACE(name, 'Dr.', ''), 'Ms', ''), '  ', ' ') FROM ...
于 2013-05-10T18:07:16.203 回答
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]
于 2013-05-10T18:10:24.347 回答
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;
}
于 2013-05-10T18:57:27.877 回答