Sql 使用扩展地址标准化器从解析地址输出错误

Sql 使用扩展地址标准化器从解析地址输出错误,sql,postgresql,postgis,Sql,Postgresql,Postgis,我试图清理和解析地址,但没有得到使用同一扩展名“address_standardizer”的两个查询之间的解析结果。在我的主要查询中,只解析了某些城市。State和zip都很好。然而,在测试中,为了了解为什么它缺少大多数城市,我在测试查询中看到了这些城市 我使用的基本查询修改为: SELECT city, (a).num, (a).street, (a).city, (a).state, (a).zip, (a).zipplus FROM (SELECT city, parse_address(

我试图清理和解析地址,但没有得到使用同一扩展名“address_standardizer”的两个查询之间的解析结果。在我的主要查询中,只解析了某些城市。State和zip都很好。然而,在测试中,为了了解为什么它缺少大多数城市,我在测试查询中看到了这些城市

我使用的基本查询修改为:

SELECT city, (a).num, (a).street, (a).city, (a).state, (a).zip, (a).zipplus
FROM (SELECT city, parse_address(city) As a
 from add_data
where city ~ ', *\D\D \d{5}$') AS p;
这导致:

city                    |num|street |city|state |zip  |zipplus
HONOLULU, HI 96819      |   |       |    |HI    |96819|
NEW YORK, NY 10018      |   |       |    |NY    |10018|
NEWHALL, CA 91321       |   |       |    |CA    |91321|
LONG BEACH, CA 90815    |   |       |    |CA    |90815|
LYNNFIELD, MA 01940     |   |       |    |MA    |01940|
CHATTANOOGA, TN 37407   |   |       |    |TN    |37407|
所以我测试了:

select city, parse_address(city) as cty
from add_data
where city ~ ', *\D\D \d{5}$';
这为我提供了城市、州和邮政编码的预期解析:

city                        |cty
BEVERLY HILLS, CA 90213     |(,,,"BEVERLY HILLS",,CA,90213,""US)
OXNARD, CA 93031            |(,,,"OXNARD",,CA|93031,""US)
STREETSBOSO, OH 44241       |(,,,"STREETSBOSO",,OH,44241,""US)
OMAHA, NE 68114             |(,,,"OMAHA",,NE,68114,""US)
CHATTANOOGA, TN 37401       |(,,,"CHATTANOOGA",,TN,37401,""US)
CUYAHOCA HEIGHTS, OH 44125  |(,,,"CUYAHOCA HEIGHTS",,OH,44125,""US)


我不确定我的查询在哪里会丢失正在解析的城市,而它仍然处理状态和拉链。如何重写查询以获得正确的解析结果?

parse\u address
需要完整的输入,或者某些地址部分缺失的指示

首先,它有助于显示输出列名:我们看到城市没有被解析,因为它位于
address1
列中,这是街道信息的聚合

select (parse_address('BEVERLY HILLS, CA 90213')).*;
 num | street | street2 |   address1    | city | state |  zip  | zipplus | country
-----+--------+---------+---------------+------+-------+-------+---------+---------
     |        |         | BEVERLY HILLS |      | CA    | 90213 |         | US
(1 row)
如果我们添加了街道信息,那么这个城市就被正确识别了

select (parse_address('123 ab street BEVERLY HILLS, CA 90213')).*;
 num |  street   | street2 |   address1    |     city      | state |  zip  | zipplus | country
-----+-----------+---------+---------------+---------------+-------+-------+---------+---------
 123 | ab street |         | 123 ab street | BEVERLY HILLS | CA    | 90213 |         | US
(1 row)
要正确解析不包含街道的地址的城市名称,您需要通过添加前导逗号明确说明没有街道信息

select (parse_address(',BEVERLY HILLS, CA 90213')).*;
 num | street | street2 | address1 |     city      | state |  zip  | zipplus | country
-----+--------+---------+----------+---------------+-------+-------+---------+---------
     |        |         |          | BEVERLY HILLS | CA    | 90213 |         | US
(1 row)
请注意,对于非标准街道类型或复杂情况,也需要在街道和城市之间添加逗号:

select (parse_address('123 ab MystreetType BEVERLY HILLS, CA 90213')).*;
 num |         street          | street2 |          address1           | city  | state |  zip  | zipplus | country
-----+-------------------------+---------+-----------------------------+-------+-------+-------+---------+---------
 123 | ab MystreetType BEVERLY |         | 123 ab MystreetType BEVERLY | HILLS | CA    | 90213 |         | US
(1 row)


select (parse_address('123 ab MystreetType, BEVERLY HILLS, CA 90213')).*;
 num |     street      | street2 |      address1       |     city      | state |  zip  | zipplus | country
-----+-----------------+---------+---------------------+---------------+-------+-------+---------+---------
 123 | ab MystreetType |         | 123 ab MystreetType | BEVERLY HILLS | CA    | 90213 |         | US

parse_address
需要一个完整的输入,或者某些地址部分缺失的指示

首先,它有助于显示输出列名:我们看到城市没有被解析,因为它位于
address1
列中,这是街道信息的聚合

select (parse_address('BEVERLY HILLS, CA 90213')).*;
 num | street | street2 |   address1    | city | state |  zip  | zipplus | country
-----+--------+---------+---------------+------+-------+-------+---------+---------
     |        |         | BEVERLY HILLS |      | CA    | 90213 |         | US
(1 row)
如果我们添加了街道信息,那么这个城市就被正确识别了

select (parse_address('123 ab street BEVERLY HILLS, CA 90213')).*;
 num |  street   | street2 |   address1    |     city      | state |  zip  | zipplus | country
-----+-----------+---------+---------------+---------------+-------+-------+---------+---------
 123 | ab street |         | 123 ab street | BEVERLY HILLS | CA    | 90213 |         | US
(1 row)
要正确解析不包含街道的地址的城市名称,您需要通过添加前导逗号明确说明没有街道信息

select (parse_address(',BEVERLY HILLS, CA 90213')).*;
 num | street | street2 | address1 |     city      | state |  zip  | zipplus | country
-----+--------+---------+----------+---------------+-------+-------+---------+---------
     |        |         |          | BEVERLY HILLS | CA    | 90213 |         | US
(1 row)
请注意,对于非标准街道类型或复杂情况,也需要在街道和城市之间添加逗号:

select (parse_address('123 ab MystreetType BEVERLY HILLS, CA 90213')).*;
 num |         street          | street2 |          address1           | city  | state |  zip  | zipplus | country
-----+-------------------------+---------+-----------------------------+-------+-------+-------+---------+---------
 123 | ab MystreetType BEVERLY |         | 123 ab MystreetType BEVERLY | HILLS | CA    | 90213 |         | US
(1 row)


select (parse_address('123 ab MystreetType, BEVERLY HILLS, CA 90213')).*;
 num |     street      | street2 |      address1       |     city      | state |  zip  | zipplus | country
-----+-----------------+---------+---------------------+---------------+-------+-------+---------+---------
 123 | ab MystreetType |         | 123 ab MystreetType | BEVERLY HILLS | CA    | 90213 |         | US

应该包括输出记录中的所有字段,以查看是否存在不匹配。查看第二个输出,并计算逗号,看起来“OXNARD”可能被放在address1字段中。否-每个查询的输出与您看到的完全相同。我在表中的数据中使用的唯一字段是“城市”。我想我看到了你的方向-如果我从州返回,然后是逗号,则由于数据中的逗号,城市似乎被推到了街道地址槽中。但是没有,如第一次输出中所示,street和city(以及num)列都是空的。应该包括输出记录中的所有字段,以查看是否存在不匹配。查看第二个输出,并计算逗号,看起来“OXNARD”可能被放在address1字段中。否-每个查询的输出与您看到的完全相同。我在表中的数据中使用的唯一字段是“城市”。我想我看到了你的方向-如果我从州返回,然后是逗号,则由于数据中的逗号,城市似乎被推到了街道地址槽中。但是否,如第一个输出中所示,街道和城市(以及num)列都为空。否-如果我在街道地址中使用或不使用添加的逗号(如示例中所示),它所做的就是在输出时将街道地址推送到城市字段。这是来自凌乱的数据,在许多行上,城市、州邮政编码都在表中的“城市”字段中。如果我像你的例子中那样使用一个很好的完整字符串,它可以很好地工作,但似乎不能清除混乱的数据。不-如果我像你的例子中那样在街道地址中添加或不添加逗号,它所做的就是在输出时将街道地址推送到城市字段。这是来自凌乱的数据,在许多行上,城市、州邮政编码都在表中的“城市”字段中。如果我像您的示例中那样使用一个漂亮的完整字符串,它可以很好地工作,但似乎不能清除混乱的数据。