我正在尝试清理数据库中“姓名”字段中的数据,并将该数据拆分为名字、中间名和姓氏。目前,我正在使用 Case
语句来查找文本中的各种触发器,以帮助我以某种方式格式化输出。
但是,我开始注意到我将测试嵌套在其他测试中,并且需要弄清楚如何递归处理数据。请参阅我如何提取 FirstName 的示例。
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
是一件容易/干净的事情.您可以使用正则表达式,但是您必须自己编写 CLR
函数来提供正则表达式功能。
关于sql - 如何递归解析SQL语句中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4629301/