• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 481
  • Last Modified:

SQL pull numeric from string

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
cheryl9063
Asked:
cheryl9063
  • 4
  • 3
  • 3
  • +3
4 Solutions
 
8080_DiverCommented:
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;

Open in new window

0
 
sshah254Commented:
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
 
LowfatspreadCommented:
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
2018 Annual Membership Survey

Here at Experts Exchange, we strive to give members the best experience. Help us improve the site by taking this survey today! (Bonus: Be entered to win a great tech prize for participating!)

 
cheryl9063Author Commented:
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
 
SharathData EngineerCommented:
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

Open in new window

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 
               CROSS APPLY dbo.fn_Split(PostalAddress,'.')) t1 
 WHERE rn = 1

Open in new window

I have tested like this.
DECLARE  @table  TABLE( 
                       PostalAddress VARCHAR(100) 
                       ) 

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

SELECT PostalAddress,value zip  
  FROM (SELECT *, 
               ROW_NUMBER() 
                 OVER(PARTITION BY PostalAddress ORDER BY position DESC) rn 
          FROM @table t 
               CROSS APPLY dbo.fn_Split(PostalAddress,'.')) t1 
 WHERE rn = 1
/*
PostalAddress	zip
5220 michaux rd,greensboro,n.c.27410	27410
5220 michaux rd,greensboro,n.c.27410-9203	27410-9203
*/

Open in new window

0
 
cheryl9063Author Commented:
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
 
SharathData EngineerCommented:
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 
               CROSS APPLY dbo.fn_Split(PostalAddress,'.')) t1 
 WHERE rn = 1
select @NEEdZip

Open in new window

0
 
awking00Commented:
Can address also be like this?
'5220 Michaux Rd., Greensboro, NC 27410'
0
 
8080_DiverCommented:
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
 
8080_DiverCommented:
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
 
awking00Commented:
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
 
cheryl9063Author Commented:
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
 
SharathData EngineerCommented:
<< 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
 
awking00Commented:
Try this -
substr(address,regexp_instr(addr,'[0-9]{5}|[0-9]{5}-[0-9]{4}'))
0
 
cheryl9063Author Commented:
Thanks
0

Featured Post

Receive 1:1 tech help

Solve your biggest tech problems alongside global tech experts with 1:1 help.

  • 4
  • 3
  • 3
  • +3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now