首页 > 解决方案 > JOIN 语句的另一个子字符串中包含的字段的 SQL 子字符串

问题描述

我正在使用来自 NYC MTA旋转门数据地铁站位置的两个数据集,一个包含在特定地铁站收集的旋转门数据,而另一个包含所述地铁站的经度和纬度。表之间没有公共键。我曾希望使用地铁站名称,但是在一张表中有许多不同的车站包含相同的名称,此外,表之间的命名约定略有不同。为了克服这个问题,我想使用地铁站名称和车站中存在的线路的组合来基于子字符串加入表格。

例如:

在火车站位置表中,一行包含

+------------------------+-----------------+
|Name                    |Line             |
+------------------------+-----------------+
|Lexington Ave - 59th St | 4-5-6-6 Express |
+------------------------+-----------------+

而在火车站数据表中的一行可能看起来像这样

+---------+-----------------+
| Station | LineName        |
+---------+-----------------+
| 59 ST   | NQR456W         |
+---------+-----------------+

LIKE我能想到的最佳解决方法是使用关键字 OR函数进行某种搜索,LOCATE以返回包含相同子字符串的单行行,这些行与站和行 ie 相同LIKE("%59%") AND NQR456 。我希望忽略 ST 和 AVE 之类的子字符串以及 '''-''' 之类的字符。

一旦我有了这些行,我想为每个可以发表JOIN声明的站创建一个具有共享唯一 ID 的正确键的新列。

预先感谢您的所有帮助

我尝试了下面的查询,但是由于仅在另一个子字符串中搜索一个子字符串,它没有按预期工作

SELECT tsl.station, td.station, td.linename, tsl.line
FROM train_station_locations tsl, turnstile_data td
WHERE CONCAT('%',LOWER(tsl.station),'%')
 LIKE CONCAT('%', REPLACE(REPLACE(td.station," st","")," ",""),'%') 
 AND  CONCAT('%',LOWER(td.linename),'%') LIKE 
 REPLACE(CONCAT('%',LOWER(tsl.line),'%'),"-","");

我参考了以下问题

https://stackoverflow.com/a/40140482/9367155

SQL:在子字符串上连接表

标签: mysqlsqlmariadbmysql-workbench

解决方案


处理没有PK的数据一定很沮丧……

根据您在上面共享的数据,似乎可以去除两个字段的非数字字符并寻找匹配项。59 = 59。

MySQL 8 支持 REGEXP_REPLACE: https ://dev.mysql.com/doc/refman/8.0/en/regexp.html#function_regexp-replace

在 MySQL 8 之前,您可以创建一个自定义函数: MySQL strip non-numeric characters to compare


推荐阅读