I have small question about SQL Server, please tell me how to solve this issue
Table: emp
id name
---------------
1 abc_ra
declare @table table(name varchar(300))
insert into @table values('Raj Parmar')
insert into @table values('Ronak mer')
insert into @table values('Mayuri nikunj trivedi')
Select
DISTINCT name,
SUBSTRING(name, 1, CHARINDEX(' ', name) - 1) as FirstName,
RTRIM(LTRIM(REPLACE(REPLACE(name,SUBSTRING(name , 1, CHARINDEX(' ', name) - 1),''),REVERSE( LEFT( REVERSE(name), CHARINDEX(' ', REVERSE(name))-1 ) ),'')))as MiddleName,
REVERSE( LEFT( REVERSE(name), CHARINDEX(' ', REVERSE(name))-1 ) ) as LastName
From @table
name FirstName MiddleName LastName
Mayuri nikunj trivedi Mayuri nikunj trivedi
Raj Parmar Raj Parmar
Ronak mer Ronak mer
You miss the case where there's no underscore in the string, which causes the error. Instead, try:
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
I assume in the case of a single word, you want to show them as both the first name and last name. You can change that value to whatever you prefer.
try this:
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
you can use CASE command to control is last name available.
SQL Fiddle
MS SQL Server 2008 Schema Setup:
Query 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
Results:
| FIRSTNAME | LASTNAME |
|-----------|----------|
| abc | rao |
| nani | (null) |
| hari | babu |
| kalibabu | (null) |
| ab | tan |
UPDATED: sqlfiddle added
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