3

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?

user1400915
  • 1,933
  • 6
  • 29
  • 55

5 Answers5

2

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
bummi
  • 27,123
  • 14
  • 62
  • 101
Preet Sangha
  • 64,563
  • 18
  • 145
  • 216
1

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

Adriaan Stander
  • 162,879
  • 31
  • 289
  • 284
1
  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

Amit Singh
  • 8,039
  • 20
  • 29
1

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
Bogdan Sahlean
  • 19,233
  • 3
  • 42
  • 57
Tman
  • 61
  • 1
  • 1
0

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         
Arun Palanisamy
  • 5,281
  • 6
  • 28
  • 53
user1400915
  • 1,933
  • 6
  • 29
  • 55