Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解析SQL中的名称字段_Sql_Sql Server - Fatal编程技术网

解析SQL中的名称字段

解析SQL中的名称字段,sql,sql-server,Sql,Sql Server,我正在尝试将名称字段分隔为适当的字段。名称字段不一致。它可以显示为Doe III、John w或Doe、John或Doe III、John或Doe、John w,或者可能缺少后缀和/或中间首字母。任何想法都将不胜感激 SELECT ( CASE LEN(REPLACE(FirstName, ' ', '')) WHEN LEN(FirstName + ' ') - 1 THEN PARSENAME(REPLACE(First

我正在尝试将名称字段分隔为适当的字段。名称字段不一致。它可以显示为Doe III、John w或Doe、John或Doe III、John或Doe、John w,或者可能缺少后缀和/或中间首字母。任何想法都将不胜感激

SELECT (
        CASE LEN(REPLACE(FirstName, ' ', ''))
            WHEN LEN(FirstName + ' ') - 1
                THEN PARSENAME(REPLACE(FirstName, ' ', '.'), 2)
            ELSE PARSENAME(REPLACE(FirstName, ' ', '.'), 3)
            END
        ) AS LastName
    ,(
        CASE LEN(REPLACE(FirstName, ' ', ''))
            WHEN LEN(FirstName + ',') - 1
                THEN NULL
            ELSE PARSENAME(REPLACE(FirstName, ' ', '.'), 2)
            END
        ) AS Suffix
    ,PARSENAME(REPLACE(FirstName, ' ', '.'), 1) AS FirstName
FROM Trusts.dbo.tblMember

如上所述,无论格式如何,我都需要名称来解析为LastName、Suffix、FirstName、MiddleInitial的相应字段,无论其是否具有后缀或中间首字母

如果给定的4个名称是唯一的案例类型,那么您可以使用如下内容

注意:为了更好地理解主查询,我使用了CTE表tbl2来分隔逗号、第一个空格和第二个空格。您可以将主查询中的这些值替换为CTE中相应的函数,以加快主查询的速度。我的意思是将主查询中的逗号替换为charindex“,”等等

我还假设name列中没有前导/尾随或额外的空格或任何垃圾字符。如果有,请先清理数据,然后再继续


请阅读并提及您的数据库、预期结果、示例数据。我尝试了以下操作:case LENREPLACEFirstName“”,when LENFirstName+“”-1然后PARSENAMEREPLACEFirstName“”,“.”,2否则PARSENAMEREPLACEFirstName“”,“.”,3以LastName结尾,case LENREPLACEFirstName“”,when LENFirstName+”,“-1然后null else PARSENAMEREPLACEFirstName,”,“.”,2作为后缀结束,PARSENAMEREPLACEFirstName,”,“.”,1作为Trusts.dbo.tblmemberth中的FirstName。如果没有处理所有案例的示例数据和基于此的预期输出,这个问题非常模糊。使用rextester.com在SQL server中创建表并插入示例行,并在此基础上告诉我们您的预期输出。我很困惑,我已经清楚地说明了我需要的输出。如上所述,无论格式如何,我都需要这个名称来解析为LastName、Suffix、FirstName、MiddleInitial的相应字段,无论它是否有后缀或中间首字母。您确实明确说明了要求,但没有提供有关数据或相关表的任何详细信息。没有这一点,谁也帮不上什么忙。但在这种情况下我不会费心的。听起来你的数据到处都是。名称是最难自动化的事情之一,因为有太多的可能性。没有好的方法可以自动完成这项工作,因为在某些情况下,每种方法都会吐出不好的数据。
with tbl2 as (
select tbl.*,
    charindex(',',name) as comma_pos,
    charindex(' ',name,1) first_space,
    charindex(' ',name,charindex(' ',name,1)+1) second_space
from tbl)

select tbl2.name

,case when second_space <> 0
        then substring(name,comma_pos+1,second_space-comma_pos-1)
      when first_space > comma_pos
        then substring(name,comma_pos+1,first_space-comma_pos-1)
      else substring(name,comma_pos+1,len(name)-comma_pos)
end as first_name

,case when second_space <> 0
        then substring(name,second_space+1,len(name)-second_space)
      when first_space > comma_pos
        then substring(name,first_space+1,len(name)-first_space)
      end as middle_name
,case when first_space=0 or first_space>comma_pos
    then substring(name,1,comma_pos-1)
    else substring(name,1,first_space-1) 
end as last_name
,case when first_space=0 or first_space>comma_pos
    then null
    else substring(name,first_space,comma_pos-first_space) 
end as suffix

from  tbl2;