我試圖清理數據在我們的數據庫中的「名稱」字段和分割解析數據這些數據轉化爲姓,中間名,姓氏&。目前,我使用Case
語句在文本內查找各種觸發器,以幫助我以某種方式格式化輸出。如何遞歸在SQL語句
不過,我開始注意到,我中嵌套等檢查測試和需要弄清楚如何處理遞歸數據。看到我如何抽取名字的這個例子。
Case
When CharIndex(' ',LTrim(RTrim(Name))) in (0,1) Then '' --'empty or LName'
When Left(Name,3) IN ('MR ','MS ', 'DR ','MRS') Then --'Prefix Titles'
Case --'If we found a prefix, run the same "tests" with the prefix removed'
When CharIndex(' ',LTrim(RTrim(Right(Name,Len(Name)-CharIndex(' ',Name)))))
in (0,1) Then ''
When SubString(LTrim(RTrim(Right(Name,Len(Name)-CharIndex(' ',Name)))),3,1)
= '&' Then SubString(LTrim(RTrim(Right(Name,Len(Name)-CharIndex(' ',
Name)))),1,5)
Else Left(LTrim(RTrim(Right(Name,Len(Name)-CharIndex(' ',Name)))),
CHarIndex(' ',LTrim(RTrim(Right(Name,Len(Name)-CharIndex(' ',Name)))))-1)
End
When SubString(LTrim(RTrim(Name)),3,1) = '&' Then
SubString(LTrim(RTrim(Name)),1,5) --'Look for initials e.g. J & A Smith'
Else Left(LTrim(RTrim(Name)),CHarIndex(' ',LTrim(RTrim(Name)))-1)
End
因此,爲了得到這個工作在更復雜的情況(例如MR JOHN A SMITH JR
),我需要遞歸測試。在命令式編程,我會做這樣的事情,如果我有一個名爲GetFirstName
功能:
GetFirstName('MR JOHN A SMITH JR')
//GetFirstName identfies 'MR' and within the function it calls:
||
\\
==> GetFirstName('JOHN A SMITH JR')
//GetFirstName identifies 'JR' and within the function it calls:
||
\\
==> GetFirstName('JOHN A SMITH')
//Finally, it returns 'JOHN'
理想的情況下,這將是巨大爲此在直SQL,但我不知道這是可能的。如果我不使用直接的SQL,會有什麼替代方法? (我使用SQL Server 2005)
這是一個在應用程序代碼而不是SQL中更好處理的任務。 – 2011-01-07 19:21:40