x
Solved

# SQL pull numeric from string

Posted on 2011-03-14
Medium Priority
482 Views
I need to be able to pull the zip code out for either example

'5220 michaux rd,greensboro,n.c.27410' or '5220 michaux rd,greensboro,n.c.27410-9203'

How?
0
Question by:cheryl9063
• 4
• 3
• 3
• +3

LVL 22

Expert Comment

ID: 35133372
Do you know for sure that the ZIP Code will be the characters after the last space in the string?
Do you only want the 5 digit Zip Code or do you want the full 9 digit if it is available?
``````-- SQL_1 - as many Zip Code Characters as are available
SELECT RIGHT(yourstring, CHARINDEX(' ', REVERSE(yourstring) - 1)) AS ZipCode
FROM yourtable;

-- SQL_2 - only the 5 digit Zip Code
SELECT LEFT(RIGHT(yourstring, CHARINDEX(' ', REVERSE(yourstring) - 1)), 5) AS ZipCode
FROM yourtable;
``````
0

LVL 9

Expert Comment

ID: 35133383
Let's assume that this data is in field1

reverse(field1)
find the first "." (or comma, or space, whatever tells that the zip code is starting) in there
charindex(reverse(field1))
right(field1, len(field1) - charindex(reverse(field1))) should give you what you want

You may need to add +1 or subtract -1 ... don't remember if MSSQL does it with 0-index or not.

Ss

0

LVL 50

Accepted Solution

ID: 35133401
like this....

select case when zipstr like '%-%' then left(zipstr,charindex('-',zipstr)-1) else zipstr end as zip
from (
select reverse(left(rcol,charindex('.',rcol)-1)) as zipstr
from (select yourcolumn as col,reverse(yourcolumn) as rcol
from ....) as x
) as y
0

LVL 1

Author Comment

ID: 35133476
LowfatSpread..What is rcol and what is "Your column?" This is not coming from a table.. This is a variable passed in that I'm having to unparse..
0

LVL 41

Expert Comment

ID: 35133860
Create a function like this.
``````CREATE FUNCTION [dbo].[fn_Split](@text nvarchar(max), @delimiter char(1) = ' ')
RETURNS @Strings TABLE (position int IDENTITY PRIMARY KEY, value nvarchar(max)) AS
BEGIN
DECLARE @index int
SET @index = -1
WHILE (LEN(@text) > 0)
BEGIN
SET @index = CHARINDEX(@delimiter , @text)
IF (@index = 0) AND (LEN(@text) > 0)
BEGIN
INSERT INTO @Strings VALUES (@text)
BREAK
END
IF (@index > 1)
BEGIN
INSERT INTO @Strings VALUES (LEFT(@text, @index - 1))
SET @text = RIGHT(@text, (LEN(@text) - @index))
END
ELSE
SET @text = RIGHT(@text, (LEN(@text) - @index))
END
RETURN
END
GO
``````
Use this function in your code as below.Replace your_table with the actual table name and PostalAddress column with actual column name.
``````SELECT PostalAddress,value zip
FROM (SELECT *,
ROW_NUMBER()
OVER(PARTITION BY PostalAddress ORDER BY position DESC) rn
FROM your_table t
WHERE rn = 1
``````
I have tested like this.
``````DECLARE  @table  TABLE(
)

INSERT @table
VALUES('5220 michaux rd,greensboro,n.c.27410'),
('5220 michaux rd,greensboro,n.c.27410-9203')

FROM (SELECT *,
ROW_NUMBER()
OVER(PARTITION BY PostalAddress ORDER BY position DESC) rn
FROM @table t
WHERE rn = 1
/*
5220 michaux rd,greensboro,n.c.27410	27410
5220 michaux rd,greensboro,n.c.27410-9203	27410-9203
*/
``````
0

LVL 1

Author Comment

ID: 35134356
There is no table... Will any of these work for a variable input such as below..

@Location = 5220 michaux rd greensboro n.c.27410

@NEEdZip =
0

LVL 41

Assisted Solution

Sharath earned 500 total points
ID: 35135180
Yes, you can try like this.

``````SELECT @NEEdZip = value
FROM (SELECT *,
ROW_NUMBER()
OVER(PARTITION BY PostalAddress ORDER BY position DESC) rn
FROM (select @Location as PostalAddress) t
WHERE rn = 1
select @NEEdZip
``````
0

LVL 32

Expert Comment

ID: 35139418
Can address also be like this?
'5220 Michaux Rd., Greensboro, NC 27410'
0

LVL 22

Expert Comment

ID: 35139982
Yes,

Create a function and, in the function, set the output/result to "RIGHT(yourstring, CHARINDEX(' ', REVERSE(yourstring) - 1)) " where yourstring is the string passed into the function as the parameter.
0

LVL 22

Assisted Solution

8080_Diver earned 500 total points
ID: 35140004
Using the variables you previously indicated:

@NEEdZip = RIGHT(@Location, CHARINDEX(' ', REVERSE(@Location) - 1))

You don't have to create the function (but, just so I could use it elsewhere ;-) I would. ;-)
0

LVL 32

Expert Comment

ID: 35140123
Without knowing the data, I'm not sure I would count on either a period introducing the zip code or the last space introducing the zip code. Are there any other examples for the input?
0

LVL 1

Author Comment

ID: 35140201
awKing..that is the problem.. Could be any kind of address with either a 5 digit of the extended american 9 digit with dash.. The state could be spelled out or not, could be dots.. I'm having to just "TRY" each and pass a successful one to an outside process that validates.. If it does not validate I come back and "try" again 5 times.. My problem is the one I mentioned at the top with n.c...
0

LVL 41

Expert Comment

ID: 35140438
<< Could be any kind of address with either a 5 digit of the extended american 9 digit with dash.. The state could be spelled out or not, could be dots.. >>

Provide sample data for all these combinations. BTW, did you try my last query?
0

LVL 32

Assisted Solution

awking00 earned 500 total points
ID: 35140742
Try this -
0

LVL 1

Author Closing Comment

ID: 35169119
Thanks
0

## Featured Post

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.