在单独的邮政编码列表中筛选地址列表



我想根据地址是否包含多个邮政编码中的任何一个来过滤一长串地址,如何构建 SQL 查询?

地址如下所示

+------------------------------------------+
|              address                     |
+------------------------------------------+
| 69, example entry road, London, wa13 657 |
| 87, example entry road, London, eC2B 984 |
+------------------------------------------+

像这样的邮政编码

+-----------+
| Postcodes |
+-----------+
| Wa13 657  |
| eC2B 984  |
| eq8 987   |
+-----------+

地址表具有ID

我最接近的是以下内容;

SELECT p.Postcodes, COUNT(*)
FROM [City Postcodes] AS p 
INNER JOIN [17-18] AS a ON (a.[Address], p.Postcodes) > 0
GROUP BY p.Postcodes;

但是,这只是计算每个邮政编码的出现次数。我真正想做的是过滤地址表并根据邮政编码识别 ID,这样我就可以获取 ID 并在 Excel 中处理数据。

所以,你只想要没有聚合的JOIN

SELECT a.*, p.Postcode
FROM [17-18] AS a INNER JOIN
     [City Postcodes] AS p
     ON instr(a.[Address], p.Postcodes) > 0;

如果您只需要特定的邮政编码,则可以添加WHERE子句。

请注意,这不会返回与邮政编码表不匹配的地址。 如果需要所有地址,请使用LEFT JOIN

如果我理解正确,您希望所有 ID 按邮政编码分组。您可以使用连接函数或 Oracle、LISTAGG 来执行此操作:

SELECT p.POSTAL, LISTAGG(a.ID, ',') WITHIN GROUP (ORDER BY p.POSTAL) ids 
FROM Address a 
INNER JOIN Postcodes p ON a.POSTAL LIKE p.POSTAL 
GROUP BY p.POSTAL;

我创建了一个sql小提琴,您可以在其中测试代码:http://www.sqlfiddle.com/#!4/ca6844/1

  • 使用 mysql,您可以使用group_concat:https://dev.mysql.com/doc/refman/8.0/en/group-by-functions.html#function_group-concat
  • 使用SQL Server,您可以使用Stuff((+字符串连接:https://learn.microsoft.com/en-us/sql/t-sql/functions/stuff-transact-sql?view=sql-server-2017

最新更新