【问题标题】:SQL substring of field contained within another substring for JOIN statementJOIN 语句的另一个子字符串中包含的字段的 SQL 子字符串
【发布时间】:2020-11-06 17:12:45
【问题描述】:

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

例如:

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

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

而在火车站数据表中的一行可能是这样的

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

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

一旦我有了这些行,我想为每个站创建一个具有共享唯一 ID 的正确键的新列,我可以在其上创建 JOIN 语句。

提前感谢您的所有帮助

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

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: Join tables on substrings

【问题讨论】:

    标签: mysql sql mariadb mysql-workbench


    【解决方案1】:

    处理没有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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-23
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多