I have a column in a table that looks like this
Name |
---|
WALKER^JAMES^K^^ |
ANDERSON^MICHAEL^R^^ |
HUFF^CHRIS^^^ |
WALKER^JAMES^K^^ |
SWEARINGEN^TOMMY^L^^ |
SMITH^JOHN^JACCOB^^ |
I need to write a query that looks like this
Name | FirstName | LastName | MiddleName |
---|---|---|---|
WALKER^JAMES^K^^ | JAMES | WALKER | K |
ANDERSON^MICHAEL^R^^ | MICHAEL | ANDERSON | R |
HUFF^CHRIS^^^ | CHRIS | HUFF | |
BUTLER^STEWART^M^^ | STEWART | BUTLER | M |
SWEARINGEN^TOMMY^L^^ | TOMMY | SWEARINGEN | L |
SMITH^JOHN^JACCOB^^ | JOHN | SMITH | JACCOB |
I need help generating the LastName column.
This is what I've tried so far
SUBSTRING
(
--SEARCH THE NAME COLUMN
Name,
--Starting after the first '^'
CHARINDEX('^', Name) + 1 ),
--Index of second ^ minus the index of the first ^
(CHARINDEX('^', PatientName, CHARINDEX('^', PatientName) +1)) - (CHARINDEX('^', PatientName))
)
This produces:
Invalid length parameter passed to the LEFT or SUBSTRING function.
I know this can work because if I change the minus sign to a plus sign it performs as expected. It produces the right integer.
Where am I going wrong? Is there a better way to do this?
I recommend SUBSTRING() as it will perform the best. The challenge with SUBSTRING is it's hard to account to keep track of the nested CHARDINDEX() calls so it's better to break the calculation into pieces. I use CROSS APPLY to alias each "^" found and start from there to search for the next. Also allows to do NULLIF() = 0, so if it can't find the "^", it just returns a NULL instead of erroring out
Parse Delimited String using SUBSTRING() and CROSS APPLY