【问题标题】:Is it possible to do a left join with part of the string?是否可以对部分字符串进行左连接?
【发布时间】:2020-09-24 22:02:07
【问题描述】:

我正在尝试连接两个表,但只考虑表 1 中的部分字符串。

我有 table_1,看起来像这样:

product              date_creation
door                 2020-01-02
car                  2020-02-10
house/big            2020-03-15

还有table_2:

product              amount
door/brown           10
door                 100
car/toyota           5
car/toyota/black     15
house/big/beach      3
house/big/beach/old  2 

我想得到这个结果:

product              date_creation      amount
door                 2020-01-02         110
car                  2020-02-10         20
house/big            2020-03-15         5

所以我想考虑所有可能的子字符串来加入表格。

我知道我可以这样做:

select t1.*, sum(t2.amount)
from table_1 t1
left join table_2 t2
on t1.product = split_part(t2.product, '/', 1)
group by 1,2

如果一切都像 doorcar。但是,由于 house/big,我陷入了无计可施的困境。

【问题讨论】:

  • 这不清楚。我们必须从你的例子中猜测。 “考虑所有可能的子字符串”和“就像”没有任何意义。 PS阅读JOIN ON的定义。它计算一个 CROSS JOIN 然后返回满足 ON 条件的行(输入行对)。您保留行的条件是什么?

标签: sql string postgresql amazon-redshift inner-join


【解决方案1】:

like 应该这样做:

select t1.*, sum(t2.amount)
from table_1 t1
left join table_2 t2 on t2.product like t1.product || '/%'
group by t.product

这确保来自t2 的“长”产品以来自t1 的“短”产品开头,后跟一个斜线。

如果完美匹配是可能的,那么以下方法更安全:

select t1.*, sum(t2.amount)
from table_1 t1
left join table_2 t2 on t2.product || '/' like t1.product || '/%'
group by t.product

我对@9​​87654326@ 子句不太满意(位置表​​达式和select * 不能很好地结合在一起)。我把它改成了t.product,我假设它是t1的主键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 2011-09-20
    相关资源
    最近更新 更多