【问题标题】: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 号

标签: sql database postgresql amazon-redshift


【解决方案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 有关。

【讨论】:

    猜你喜欢
    • 2012-04-05
    • 2013-11-24
    • 2012-01-19
    • 2011-05-05
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    相关资源
    最近更新 更多