This is a question address canonicalization and parsing. Essentially what you're talking about is handled through a gazetteer (geographical rule set). There are two ways to do this right,
address_standardizer
from the PostGIS project and certainly better if you're only using United States addresses.
pgsql-postal
may be a better method for international addresses.
I'll show the address standardizer version for the address,
Chicken Ranch
10511 Homestead Rd
Pahrump, NV 89061
Using standardize_address
from address_standardizer
, returns a composite type of stdaddr
. First we install it,
CREATE EXTENSION address_standardizer;
CREATE EXTENSION address_standardizer_data_us;
And, then we can use it like this.
SELECT * FROM standardize_address('us_lex',
'us_gaz', 'us_rules', '10511 Homestead Rd, Pahrump, NV 89061');
building | house_num | predir | qual | pretype | name | suftype | sufdir | ruralroute | extra | city | state | country | postcode | box | unit
----------+-----------+--------+------+---------+-----------+---------+--------+------------+-------+---------+--------+---------+----------+-----+------
| 10511 | | | | HOMESTEAD | ROAD | | | | PAHRUMP | NEVADA | USA | 89061 | |
(1 row)
So you can see, ROAD
is pulled out in suftype
Likewise,...
SELECT * FROM standardize_address('us_lex',
'us_gaz', 'us_rules', '1600 Pennsylvania Avenue, NW Washington, D.C. 20500');
building | house_num | predir | qual | pretype | name | suftype | sufdir | ruralroute | extra | city | state | country | postcode | box | unit
----------+-----------+--------+------+---------+--------------+---------+-----------+------------+-------+------+-------+---------+-----------+-----+--------------
| 1600 | | | | PENNSYLVANIA | AVENUE | NORTHWEST | | | | | USA | D C 20500 | | # WASHINGTON