如何在记录中的子字符串上连接表?

Posted

技术标签:

【中文标题】如何在记录中的子字符串上连接表?【英文标题】:How can I join tables on a substring in a record? 【发布时间】:2014-08-12 17:39:10 【问题描述】:

我有一个将名称与帐户 ID 相关联的表,如下所示

**Accounts**
name
account_id

另一个类似的表格将信息与帐户 uri 相关联

**Info**
information
account_uri

帐户 uri 如下所示:/some/random/path/123456/randomDigits

其中 123456 是与用户关联的 accound_id。

我怎样才能加入这些表,并得到类似的结果

**results**
name
information

这是一个亚马逊 redshift/postgresql 数据库。感谢您的建议!

【问题讨论】:

你的ids在account_uri中都是6位数吗? 5 到 7 位数字之间的任意位置 @johncorser 我相信 Mihai 想要得到的是,如果 ID 与 uri 号码匹配。 是的,account_id 匹配 uri 号 【参考方案1】:

如果您无法将 account_id 放入 Info 表中,这将起作用:

SELECT A.Name,
  I.Information
FROM Information I
JOIN Account A
  ON A.account_id = REVERSE(SUBSTRING(REVERSE([account_uri]),0,CHARINDEX('/',REVERSE(account_uri))))

REVERSE(...) 用于创建 LastIndexOf 函数。

可能只想做:

SELECT REVERSE(SUBSTRING(REVERSE([account_uri]),0,CHARINDEX('/',REVERSE(account_uri))))
FROM Information

查看 SUBSTRING/REVERSE 是否获取了整个帐户 ID

这应该找到'/'之间的第二个字符串

SUBSTRING(REVERSE(SUBSTRING(REVERSE([account_uri]),CHARINDEX('/',REVERSE(account_uri)))),0,CHARINDEX('/',REVERSE(SUBSTRING(REVERSE([account_uri]),CHARINDEX('/',REVERSE(account_uri)))))

【讨论】:

谢谢!现在我得到一个空集。这可能与表格本身有关,所以我会尝试解决这个问题,一旦我确定它有效,我就会将其标记为已接受。 好的,我会在信息表中选择(添加)REVERSE,以确保结果得到正确的值 啊,问题是 account_uri 的格式实际上是 /path/to/123456/randomNumbers 其中 123456 是 account_uri。我会修改这个问题。你知道如何加入吗? 如果合并数据,丑是可以的! 感谢您的帮助。当/如果我弄清楚了,我会在这里发帖。【参考方案2】:

效率不高,但你可以这样做:

select a.name, i.information
from accounts a join
     info i
     on i.account_uri like '%/' || a.account_id;

不幸的是,这种数据结构很难利用索引。

【讨论】:

它确实有效,但需要很长时间,而且我的数据集只会越来越大。【参考方案3】:

另一种解决方案

SELECT a.name, i.information
FROM accounts AS a
INNER JOIN info AS i ON SUBSTRING_INDEX(i.account_url, '/', -1) = a.account_id  

Demo

旁注:这根本不是一个合适的结构;)而且我不确定这是否适用于 PostgreSQL,因为 SUBSTRING_INDEX 函数。我真的没有注意到这与 PostgreSQL 有关。

【讨论】:

以上是关于如何在记录中的子字符串上连接表?的主要内容,如果未能解决你的问题,请参考以下文章

Datatable C# - 如何根据 ID 从一个表中获取详细记录及其关联的另一表中的子记录

python,如何获取字符串中的子字符串,部分字符串

如何遍历firebase中的子记录?

Redshift:连接到由表中的 SELECT * 组成的子查询/CTE 相当于连接表本身,还是性能下降?

如何在 Access 的子窗体上不显示选定的记录?

如何在 AWS Redshift 数据库中获取过滤器和分组依据子句的子字符串