簡體   English   中英

SQL刪除字符串的一部分

[英]SQL remove part of string

---我選擇了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不是一個人唯一的,它對於一個可以有多個人居住的地址是唯一的。

您可以嘗試如下操作:

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

您可以在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]

您可以使用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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM