Sql server 如何在SQL Server中将一列拆分为两列
我有一个关于SQL Server的小问题,请告诉我如何解决这个问题 表:Sql server 如何在SQL Server中将一列拆分为两列,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我有一个关于SQL Server的小问题,请告诉我如何解决这个问题 表:emp id name --------------- 1 abc_rao 2 nani 3 hari_babu 4 kalibabu 5 ab_tan 基于该表,我希望输出如下所示 id firstname lastname 1 abc rao 2 nani nothing
emp
id name
---------------
1 abc_rao
2 nani
3 hari_babu
4 kalibabu
5 ab_tan
基于该表,我希望输出如下所示
id firstname lastname
1 abc rao
2 nani nothing
3 hari babu
4 kalibabu nothing
5 ab tan
我试着这样做:
select
SUBSTRING(name, 1, CHARINDEX('_', name) - 1) as firstname ,
SUBSTRING(name, CHARINDEX('_', name) + 1, LEN(name)) as lastname
from emp
但我并没有得到预期的结果
相反,我得到了一个错误:
味精537,第16级,状态2,第3行传递给LEFT或SUBSTRING函数的长度参数无效 请告诉我怎么解决这个问题 在SQL Server中使用查询问题尝试以下操作:
select
case when CHARINDEX('_',name)>0
then SUBSTRING(name,1,CHARINDEX('_',name)-1)
else name end firstname,
CASE WHEN CHARINDEX('_',name)>0
THEN SUBSTRING(name,CHARINDEX('_',name)+1,len(name))
ELSE NULL END as lastname
from emp
您可以使用CASE命令来控制姓氏是否可用
MS SQL Server 2008架构设置:
declare @t table (id int, name varchar(50))
insert into @t (id,name) values( 1 ,'abc_rao')
insert into @t (id,name) values( 2 ,'nani')
insert into @t (id,name) values( 3 ,'hari_babu')
insert into @t (id,name) values( 4 ,'kalibabu')
insert into @t (id,name) values( 5 ,'ab_tan')
select
case when CHARINDEX('_',name)>0
then SUBSTRING(name,1,CHARINDEX('_',name)-1)
else name end firstname,
CASE WHEN CHARINDEX('_',name)>0
THEN SUBSTRING(name,CHARINDEX('_',name)+1,len(name))
ELSE NULL END as lastname
from @t
| FIRSTNAME | LASTNAME |
|-----------|----------|
| abc | rao |
| nani | (null) |
| hari | babu |
| kalibabu | (null) |
| ab | tan |
查询1:
declare @t table (id int, name varchar(50))
insert into @t (id,name) values( 1 ,'abc_rao')
insert into @t (id,name) values( 2 ,'nani')
insert into @t (id,name) values( 3 ,'hari_babu')
insert into @t (id,name) values( 4 ,'kalibabu')
insert into @t (id,name) values( 5 ,'ab_tan')
select
case when CHARINDEX('_',name)>0
then SUBSTRING(name,1,CHARINDEX('_',name)-1)
else name end firstname,
CASE WHEN CHARINDEX('_',name)>0
THEN SUBSTRING(name,CHARINDEX('_',name)+1,len(name))
ELSE NULL END as lastname
from @t
| FIRSTNAME | LASTNAME |
|-----------|----------|
| abc | rao |
| nani | (null) |
| hari | babu |
| kalibabu | (null) |
| ab | tan |
:
declare @t table (id int, name varchar(50))
insert into @t (id,name) values( 1 ,'abc_rao')
insert into @t (id,name) values( 2 ,'nani')
insert into @t (id,name) values( 3 ,'hari_babu')
insert into @t (id,name) values( 4 ,'kalibabu')
insert into @t (id,name) values( 5 ,'ab_tan')
select
case when CHARINDEX('_',name)>0
then SUBSTRING(name,1,CHARINDEX('_',name)-1)
else name end firstname,
CASE WHEN CHARINDEX('_',name)>0
THEN SUBSTRING(name,CHARINDEX('_',name)+1,len(name))
ELSE NULL END as lastname
from @t
| FIRSTNAME | LASTNAME |
|-----------|----------|
| abc | rao |
| nani | (null) |
| hari | babu |
| kalibabu | (null) |
| ab | tan |
更新:sqlfiddle添加了如果字符串中没有下划线,则会导致错误。相反,请尝试:
select
case CHARINDEX('_', name) when 0 then name
else SUBSTRING(name, 1, CHARINDEX('_', name) - 1) end firstName,
case CHARINDEX('_', name) when 0 then name
else SUBSTRING(name, CHARINDEX('_', name) + 1, LEN(name)) end lastname
from emp
我假设在单个单词的情况下,您希望将它们显示为名字和姓氏。您可以将该值更改为您喜欢的任何值。如果此时您可以更改设计,我建议您这样做。将名称保存到两个字段中以开始。这是一个更好的设计。你绝对会得到预期的结果——你只是从来没有真正把心思放在你写的东西上。请参阅,对于nani(id 2),没有ux,因此charindex将返回NULL,这对于子字符串来说是无效的输入(因此需要在那里合并以将其转换为数字)。然后在你的putpu里“什么都没有”是从哪里来的?
declare @tbl table(name varchar(20))
insert into @tbl values ('Abdul$Rahim')
insert into @tbl values('Tariq$Jameel')
select
PARSENAME(replace(name,'$','.'),2) as firstname,
PARSENAME(replace(name,'$','.'),1) as lastname
from @tbl