user1400915
user1400915

Reputation: 1943

Substring in sql server on numbers

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

Answers (5)

user1400915
user1400915

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

Tman
Tman

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

Preet Sangha
Preet Sangha

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

Amit Singh
Amit Singh

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

SQL FIDDLE DEMO

Upvotes: 1

Adriaan Stander
Adriaan Stander

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

SQL Fiddle DEMO

Upvotes: 1

Related Questions