Reputation: 1943
I have a column name called "PersonNameID"
which contains two values
ABCD-GHJI
ABHK-67891
HJKK-HJJJMH-8990
I have to extract only the first part of the "PersonNameID" which contains number after "-".Ideally my output should be
ABCD-GHJI
ABHK
HJKK-HJJJMH
but when I use following code :
SELECT TOP 100
CONVERT(NVARCHAR(100),
SUBSTRING(PersonNameID, 1,
CASE
WHEN CHARINDEX('-', PersonNameID) > 0
THEN LEN(PersonNameID) -
LEN(REVERSE(SUBSTRING(REVERSE(PersonNameID), 1, CHARINDEX('-', REVERSE(PersonNameID)))))
ELSE LEN(PersonNameID)
END
)
) AS New_PersonNameID
FROM Person
I get the output as
ABCD
ABHK
HJKK
Any modifications to the above code to get the desired output?
Upvotes: 4
Views: 4689
Reputation: 1943
I have found the solution to the above situation...
DECLARE @Person TABLE(
Person_NAME_Original VARCHAR(500),
Person_NAME_Modified VARCHAR(500)
)
INSERT INTO @Person (Person_NAME_Original,Person_NAME_Modified)
SELECT top 1000 PersonNameID,
CASE WHEN CHARINDEX('-',PersonNameID) = 0
THEN PersonNameID
WHEN iSNUMERIC( rIGHT(PersonNameID ,CHARINDEX('-',REVERSE(PersonNameID))-1))=1
THEN LEFT(PersonNameID, len(PersonNameID) - CHARINDEX('-',REVERSE(PersonNameID) )-1)
ELSE PersonNameID
END AS New_PersonNameID
from Person
select * from @Person
Upvotes: 0
Reputation: 81
Any numeric after '-' will be deleted. You can play with the patindex pattern to suit your need.
SELECT
CASE WHEN PATINDEX('%-_[0-9]%',PersonNameID)>0 THEN LEFT(PersonNameID,CHARINDEX('-',PersonNameID)-1)
ELSE PersonNameID
END
AS New_PersonNameID
FROM Person
Upvotes: 1
Reputation: 65476
Use pattern matching to find the numeric ones and then work out where the numeric
SELECT
LEFT(PersonNameID,
CASE WHEN PersonNameID LIKE '%[0-9]%' AND CHARINDEX('-', PersonNameID) > 0
THEN
CHARINDEX('-', PersonNameID)-1
ELSE
LEN(PersonNameID)
END) AS NewPersonId
FROM
Person
Upvotes: 2
Reputation: 8109
SELECT TOP 100
(CASE
WHEN CHARINDEX('-',PersonNameID )>0 AND
iSNUMERIC( rIGHT(PersonNameID ,CHARINDEX('-',PersonNameID )))=1
THEN
lEFT(PersonNameID ,CHARINDEX('-',PersonNameID)-1)
ELSE
PersonNameID
END
) AS New_PersonNameID
FROM Person
Upvotes: 1
Reputation: 166346
How about something like
DECLARE @Person TABLE(
PersonNameID VARCHAR(50)
)
INSERT INTO @Person VALUES ('ABCD-GHJI'),('ABHK-67891')
SELECT top 100
CASE
WHEN CHARINDEX('-',PersonNameID ) = 0
THEN PersonNameID
WHEN ISNUMERIC(RIGHT(PersonNameID,LEN(PersonNameID) - CHARINDEX('-',PersonNameID ))) = 0
THEN PersonNameID
ELSE LEFT(PersonNameID, CHARINDEX('-',PersonNameID )-1)
END AS New_PersonNameID
from @Person
Upvotes: 1