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

时间:2014-08-12 17:39:11

标签: sql database postgresql amazon-redshift

我有一个表格,将姓名与帐户ID相关联,就像这样

**Accounts**
name
account_id

和另一个这样的表将信息与帐户uri的

相关联
**Info**
information
account_uri

帐号uri看起来像这样:/ some / random / path / 123456 / randomDigits

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

我如何加入这些表格,并得到像

这样的结果
**results**
name
information

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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

如果您无法将account_id放入信息表中,这将有效:

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)))))

答案 2 :(得分:1)

另一种解决方案

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

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