我有一列。在該列中保存了Person的全名(姓,名)。有時,它被保存像分開保存在一列中的值
Michael, Myers
有時名稱保存像
Michael Myers
他們之間沒有逗號。
如果我加載列並將其保存到變量,它看起來當然像:Michael, Myers
或Michael Myers
。
問題是:如果我從數據庫加載列,我如何在不同的變量中彼此獨立地保存名字和姓氏。
我有一列。在該列中保存了Person的全名(姓,名)。有時,它被保存像分開保存在一列中的值
Michael, Myers
有時名稱保存像
Michael Myers
他們之間沒有逗號。
如果我加載列並將其保存到變量,它看起來當然像:Michael, Myers
或Michael Myers
。
問題是:如果我從數據庫加載列,我如何在不同的變量中彼此獨立地保存名字和姓氏。
fullname
有什麼可能的值?鑑於你上面的例子,有兩個,不是像一些其他瘸子不分開好,一致的方式:
string firstName;
string lastName;
if(fullname.Contains(","))
{
string[] splitNames = fullName.Split(",");
lastName = splitNames[0];
firstName = splitNames[1];
}
else if(splitNames.Contains(" "))
{
string[] splitNames = fullName.Split(" ");
firstName = splitNames[0];
lastName = splitNames[1];
}
else
{
//Some other logic.
}
這是一個數據噩夢。如果可能的話,我強烈建議在源頭修正這個問題(使用兩個單獨的列)並修復一次數據。
假設它不(或不是現在):
你會得到大多數情況下向右只是想尋找一個逗號和採用基於結果的分支邏輯。但是,有很多邊緣案例需要考慮。一種方法的輪廓是
string[] parts = theColumn.Trim().Split(',');
if (parts.Length == 1)
{
// Find the last occurrence of ' ' and split first/last name based on that
// People may have middle names entered e.g. Michael M. Myers
}
else if (parts.Length == 2)
{
firstName = parts[1];
lastName = parts[0];
}
else
{
// Dealing with a more complex case like Myers, Jr., Michael
// You will have to develop logic for such special cases that may
// be in your data.
}
你會遇到與單逗號情況下有像邁克爾·邁爾斯,小或邁克爾·邁爾斯,DDS的名稱問題。更完整的邏輯會測試這種情況。
如果存在某種名稱後綴,您可能會遇到最後一個格式爲2個(或多個)逗號的情況。你將不得不決定花費多少時間在那裏消毒邏輯。就我個人而言,我傾向於記錄所有發生這種情況幾個月的情況,以發展我的邏輯。
我用了幾年前的產品,做了很好的工作,把名字從自由格式的字段中拉出來,並整理出名字,姓氏等等。可能值得having a look at。
非常全面的答案,但一定要刪除空格。你可以使用Trim()。哦,還包括針對數據庫設計者的一些暴力。 –
@Norla:修剪左/右空間的好處。這只是一個大綱。有些產品致力於讓這種事情正確。邏輯是不平凡的。 –
需要更多的正則表達式! :) –
你可以在「,」上做一個字符串分割。然後在「」上分割另一個字符串。這將確保你已經涵蓋了兩種情況。
但是,你真的想要做的是擊中你的DBA與一個大型木製物體填塞兩列成一體。
沒有得到不同意的收益。大金屬物體,最好是梅斯,儘管一個好的枷鎖可能很有趣。 –
是的,你是對的,這不是保存數據的最佳方式。 Iam是該公司的新成員,他們擁有龐大的數據結構。如果我想調整一下,我必須在代碼中改變很多東西,這將是一個巨大的努力。 – Paks
正如其他人所說的逗號分割是微不足道的。真正的問題是你不知道會有多少味道出現。如果只有這兩個,然後
以下假設的SQL Server是你的分貝,像
Select
Case
When CharIndex(',',[DaftNameField]) = 0
Then Substring([SomeNameField],CharIndex(',',[SomeNameField]),255)
else Substring([SomeNameField],1, CharIndex(' ',[SomeNameField]) - 1)
end As Forename,
Case
When CharIndex(',',[SomeNameField]) = 0
Then Substring([SomeNameField],1 CharIndex(',',[SomeNameField]) - 1)
else Substring([SomeNameField], CharIndex(' ',[SomeNameField]) + 1, 255)
end As Surname
From SomeTable
把我的頭這個頂部,但它基本上是正確的。正如你所看到的那樣已經很痛苦,加入中間名,尊稱等等,會變得更糟。
哦,請告訴我有此表中某一類是PersonID的。
這對邁克爾邁爾斯來說不太好,小 –
這是一個if ... else如果。它也不適用於「邁克爾,邁爾斯」。 –
正確...這就是爲什麼我說_給你上面的例子... _ –