Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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_Sql Server 2008_Parsing - Fatal编程技术网

从sql表解析名字和姓氏

从sql表解析名字和姓氏,sql,sql-server,sql-server-2008,parsing,Sql,Sql Server,Sql Server 2008,Parsing,我的SQL Server 2008数据库中有一列包含c/o全名。我在把名字和姓氏分开时遇到了问题。我在自己的列中有c/o,但我需要名字/姓氏。我知道第二个和第三个案例陈述有问题,但我不确定我需要改变什么。我应该将索引变量存储在某个地方以引用它们吗 Declare @t table ( [name] varchar(100) ) INSERT INTO @t ( Name ) SELECT Street1 FROM tblPeople WHERE CO = 'Y' AND LastName NO

我的SQL Server 2008数据库中有一列包含c/o全名。我在把名字和姓氏分开时遇到了问题。我在自己的列中有c/o,但我需要名字/姓氏。我知道第二个和第三个案例陈述有问题,但我不确定我需要改变什么。我应该将索引变量存储在某个地方以引用它们吗

Declare @t table ( [name] varchar(100) )

INSERT INTO @t ( Name )
SELECT Street1 FROM tblPeople
WHERE CO = 'Y' AND LastName NOT LIKE 'SUMMERHAVEN INC' AND Street1 Like '%c/o%'

SELECT
    [name],
    CHARINDEX(' ', [name]),
    CASE WHEN CHARINDEX(' ', [name]) > 0 THEN
        LEFT([name],CHARINDEX(' ',[name])-1)
    ELSE
        [name]
    END as CO,
    CASE WHEN CHARINDEX(' ', [name]) > 0 THEN
        SUBSTRING([name],CHARINDEX(' ',[name])+1, ( LEN([name]) - CHARINDEX(' ',[name])+1) )
    ELSE
        NULL
    END as FIRST_NAME,
    CASE WHEN CHARINDEX(' ', [name]) > 0 THEN
        SUBSTRING([name],CHARINDEX(' ',[name])+1, ( LEN([name]) - CHARINDEX(' ',[name])+1) )
    ELSE
        NULL
    END as LAST_NAME
FROM @t

披露:像这样解析数据是个坏主意,但现在你可以:

Declare @t table ( [name] varchar(100) )

insert into @t ( Name ) values ('c/o Full Name')

SELECT
CASE WHEN CHARINDEX(' ', [name]) > 0 THEN
    LEFT([name],CHARINDEX(' ',[name])-1)
ELSE
    [name]
END as CO,
CASE WHEN CHARINDEX(' ', [name]) > 0 THEN
    SUBSTRING([name],CHARINDEX(' ',[name])+1, CHARINDEX(' ',[name]) )
ELSE
    NULL
END as FIRST_NAME,
CASE WHEN CHARINDEX(' ', [name]) > 0 THEN
    SUBSTRING([name],CHARINDEX(' ',[name], CHARINDEX(' ',[name])+1), len([name]))
ELSE
    NULL
END as LAST_NAME
FROM @t

披露:像这样解析数据是个坏主意,但现在你可以:

Declare @t table ( [name] varchar(100) )

insert into @t ( Name ) values ('c/o Full Name')

SELECT
CASE WHEN CHARINDEX(' ', [name]) > 0 THEN
    LEFT([name],CHARINDEX(' ',[name])-1)
ELSE
    [name]
END as CO,
CASE WHEN CHARINDEX(' ', [name]) > 0 THEN
    SUBSTRING([name],CHARINDEX(' ',[name])+1, CHARINDEX(' ',[name]) )
ELSE
    NULL
END as FIRST_NAME,
CASE WHEN CHARINDEX(' ', [name]) > 0 THEN
    SUBSTRING([name],CHARINDEX(' ',[name], CHARINDEX(' ',[name])+1), len([name]))
ELSE
    NULL
END as LAST_NAME
FROM @t

这里有一种使用公共表表达式的方法,因此查找要中断的空间的逻辑是合理的自文档化的

Declare @t table ( [name] varchar(100) )

insert into @t ( Name )
select 'one two three'
union select 'a bc def'
union select 'one two'
union select 'one'

;with cte1 as 
(
    select name
    ,charindex(' ', name) FirstSpace
    from @t
)
, cte2 as (
    select name
    , FirstSpace
    ,charindex(' ', name, FirstSpace+1) SecondSpace
    from cte1
)
select name
, FirstSpace
, SecondSpace
, case when FirstSpace=0 then name else substring(name, 1, FirstSpace-1) end Company
, case when SecondSpace=0 then null else substring(name, FirstSpace+1, SecondSpace-FirstSpace-1) end FirstName
, case when SecondSpace=0 or SecondSpace=len(name) then null else substring(name, SecondSpace+1, len(name)-SecondSpace) end LastName
from cte2

这里有一种使用公共表表达式的方法,因此查找要中断的空间的逻辑是合理的自文档化的

Declare @t table ( [name] varchar(100) )

insert into @t ( Name )
select 'one two three'
union select 'a bc def'
union select 'one two'
union select 'one'

;with cte1 as 
(
    select name
    ,charindex(' ', name) FirstSpace
    from @t
)
, cte2 as (
    select name
    , FirstSpace
    ,charindex(' ', name, FirstSpace+1) SecondSpace
    from cte1
)
select name
, FirstSpace
, SecondSpace
, case when FirstSpace=0 then name else substring(name, 1, FirstSpace-1) end Company
, case when SecondSpace=0 then null else substring(name, FirstSpace+1, SecondSpace-FirstSpace-1) end FirstName
, case when SecondSpace=0 or SecondSpace=len(name) then null else substring(name, SecondSpace+1, len(name)-SecondSpace) end LastName
from cte2
令我惊讶的是,它在2008年上市

考虑以下几点

Declare @YourTable table (Name varchar(50))
Insert Into @YourTable values 
 ('c/o Cher')
,('c/o John Smith')
,('John Smith')

Select *
      ,FirstName=parsename(replace(ltrim(rtrim(replace(name,'c/o',''))),' ','.'),2)
      ,LastName =parsename(replace(ltrim(rtrim(replace(name,'c/o',''))),' ','.'),1)
 From @YourTable
返回

Name            FirstName   LastName
c/o Cher        NULL        Cher
c/o John Smith  John        Smith
John Smith      John        Smith
令我惊讶的是,它在2008年上市

考虑以下几点

Declare @YourTable table (Name varchar(50))
Insert Into @YourTable values 
 ('c/o Cher')
,('c/o John Smith')
,('John Smith')

Select *
      ,FirstName=parsename(replace(ltrim(rtrim(replace(name,'c/o',''))),' ','.'),2)
      ,LastName =parsename(replace(ltrim(rtrim(replace(name,'c/o',''))),' ','.'),1)
 From @YourTable
返回

Name            FirstName   LastName
c/o Cher        NULL        Cher
c/o John Smith  John        Smith
John Smith      John        Smith

看起来像SQL Server?哪个版本?@HartCO我在问题中添加了这个版本,但它是SQL Server 2008。一些示例数据如何?“我们没有您的tblPeople表。@SeanLange一个名称示例是c/o Sara SchultzLooks,比如SQL Server?哪个版本?@HartCO我在问题中添加了这个版本,但它是SQL Server 2008。一些示例数据如何?“我们没有您的tblPeople表。@SeanLange一个名称示例是c/o Sara SchultzCan您能解释一下为什么这样解析数据是个坏主意吗?@kevorski,因为这不是一种可靠的解析数据的方法。”。如果你有多个名字呢?还是一个复杂的姓氏,用户会在其中留下一个空格?当然,如果你从一个你无法更改的来源获得这些数据,那么你会坚持使用现有的数据,这是你最好的选择。你能解释一下为什么这样解析数据是个坏主意吗?@kevorski,因为这不是一种可靠的解析数据的方法。如果你有多个名字呢?还是一个复杂的姓氏,用户会在其中留下一个空格?当然,如果你从一个你无法改变的来源获得这些数据,那么你就会坚持你所拥有的,这是你最好的选择。@SeanLange我相信你是不久前告诉我这件事的人。好奇的文档显示2012+是的文档有点奇怪。类似于显示其他版本的东西,它只能追溯到2012年,但其他项目,它将追溯到更远。然后,像你所说的,他们中的一个会提到,只有在2012年+才有,这是错误的。我不知道他们为什么走这条路。@SeanLange我相信你是不久前告诉我这件事的人。好奇的文档显示2012+是的文档有点奇怪。类似于显示其他版本的东西,它只能追溯到2012年,但其他项目,它将追溯到更远。然后,像你所说的,他们中的一个会提到,只有在2012年+才有,这是错误的。不知道他们为什么走这条路。