从sql表解析名字和姓氏
我的SQL Server 2008数据库中有一列包含c/o全名。我在把名字和姓氏分开时遇到了问题。我在自己的列中有c/o,但我需要名字/姓氏。我知道第二个和第三个案例陈述有问题,但我不确定我需要改变什么。我应该将索引变量存储在某个地方以引用它们吗从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
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年+才有,这是错误的。不知道他们为什么走这条路。