---我选择了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
并非个人所独有,它对于地址可以包含多个人的地址而言是唯一的。
答案 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;
}