use*_*912 8 sql-server sql-server-2012
我对SQL Server有一个小问题,请告诉我如何解决这个问题
表: emp
id name
---------------
1 abc_rao
2 nani
3 hari_babu
4 kalibabu
5 ab_tan
Run Code Online (Sandbox Code Playgroud)
基于该表我想要输出如下
id firstname lastname
1 abc rao
2 nani nothing
3 hari babu
4 kalibabu nothing
5 ab tan
Run Code Online (Sandbox Code Playgroud)
我试过这样的:
select
SUBSTRING(name, 1, CHARINDEX('_', name) - 1) as firstname ,
SUBSTRING(name, CHARINDEX('_', name) + 1, LEN(name)) as lastname
from emp
Run Code Online (Sandbox Code Playgroud)
但我没有得到完全预期的结果.
相反,我收到一个错误:
消息537,级别16,状态2,行3
传递给LEFT或SUBSTRING函数的长度参数无效.
请告诉我如何解决这个问题
在SQL Server中使用查询问题
Had*_*ifi 16
试试这个:
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
Run Code Online (Sandbox Code Playgroud)
您可以使用CASE命令来控制可用的姓氏.
MS SQL Server 2008架构设置:
查询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
Run Code Online (Sandbox Code Playgroud)
结果:
| FIRSTNAME | LASTNAME |
|-----------|----------|
| abc | rao |
| nani | (null) |
| hari | babu |
| kalibabu | (null) |
| ab | tan |
Run Code Online (Sandbox Code Playgroud)
更新:sqlfiddle补充说