SQL删除部分字符串

时间:2013-05-10 18:03:55

标签: c# sql-server

---我选择了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语句识别变化(博士,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并非个人所独有,它对于地址可以包含多个人的地址而言是唯一的。

3 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

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

答案 1 :(得分: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]

答案 2 :(得分: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;
}