sql - 如何递归解析SQL语句中的数据

标签 sql sql-server sql-server-2005 tsql recursion

我正在尝试清理数据库中“姓名”字段中的数据,并将该数据拆分为名字、中间名和姓氏。目前,我正在使用 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/

相关文章:

c# - SQL Server 日期时间问题?

sql - 在 SQL Server 中使用 ISNULL() 时是否存在任何性能问题?

mysql - 按另一个计数选择计数组(Mysql

mysql - 如何从第一行的列值的表中选择客户的最新记录

sql - 如何将具有任何列的值表复制到具有一列的其他表

sql-server - 赢得身份验证 NT 权限\匿名登录

asp.net - 通过长轮询检查数据库的变化

java - 如何在 Spring Query 中使用 Inner Join 查询转换 Select

sql - 获取值的所有排列 - 成对

.net - 如何以编程方式检索 SQL Server 2005 中 View 的更改 View 脚本