【问题标题】:join tables based on partial string sql基于部分字符串sql连接表
【发布时间】:2020-08-04 16:17:49
【问题描述】:

我有两张桌子:

地区

imd

区域包含一个位置列,其中包含有关英国城市的信息。 imd 表包含一列“名称”,其中还包括城市名称。

我想根据位置和名称连接两个表,但在区域表中,位置还包括国家/地区名称,而 imd 表仅包含城市名称。我想根据部分字符串匹配加入表 我已经尝试了以下代码,但它不起作用。

SELECT *
FROM s.regional, s.imd
WHERE s.regional.location like concat('%',s.imd.Name)

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。解释“不工作”是什么意思。你为什么选择不使用现代的、明确的、标准的、可读的JOIN语法?

标签: sql join left-join pgadmin-4


【解决方案1】:

您可以将 [regional] 表中 [location] 字段的第一部分放在逗号之前,并将其连接到 [imb] 表中的 [name] 列,如下所示:

SELECT a.*,b.*
FROM s.regional a LEFT JOIN s.imb b ON SPLIT_PART(a.location, ',', 1)  = b.[name]

理想情况下,您应该将 [location] 字段移动到它自己的表中,您可以在其中包含城市、国家/地区等列,并创建对该表的引用(外键)。将来可以轻松维护(插入/更新/删除)您的表。

【讨论】:

  • 我正在使用 pgadmin 4。它给出了错误 ERROR: function charindex(unknown, text) does not exist。提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。
  • 我已更新语法以匹配 PostGreSQL (SPLIT_PART) 中的函数
  • 这工作谢谢!但是对于区域表中的某些观察结果,例如英国伦敦,如果我将其与具有“伦敦市”的 imd 表进行匹配,则不会匹配。有没有办法可以使用 LIKE 运算符来做到这一点?
  • 如果只有少数几个实例,您可以使用 REPLACE 删除第一部分: SPLIT_PART(a.location, ',', 1) = REPLACE (b.NAME, 'City的 ', '')。如果这有帮助,也标记为答案。
猜你喜欢
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多