首页 > 解决方案 > 带有 LIKE 条件的内部连接

问题描述

我使用 Postgres 11,我有这个查询:

select sessions.* 
from sessions 
  INNER JOIN map ON (sessions.customer = map.customer) 
WHERE map.prr @> ARRAY['A4'] 
order by session_start DESC;

现在这给了我结果,但它遗漏了一些客户的名字。我在会话表中的客户名称如下:bmw honda bmw-12345-然后此查询将仅显示bmw honda

在地图中,客户名称没有-12345(或任何数字),但我需要使用它,LIKE 所以如果 map.customer 有bmw并且 sessions.customer 有bmw-888bmw它会同时显示两者。

我已经尝试过那里的陈述,但它没有给我需要的结果或给出错误:

roles=# select sessions.* 
from sessions 
INNER JOIN map ON map.customer LIKE '%' + CONCAT(CONCAT('%',sessions.customer),'%') + '%' 
WHERE map.prr @> ARRAY['A4'] 
order by session_start DESC;

ERROR:  operator does not exist: unknown + text
LINE 1: ..._sessions INNER JOIN map ON map.customer LIKE '%' + CONCAT(C...
                                                             ^
HINT:  No operator matches the given name and argument types. You might need to add explicit type casts.

select sessions.* from sessions INNER JOIN map ON (sessions.customer LIKE map.customer) WHERE map.prr @> ARRAY['A4'] order by session_start DESC;

select sessions.* from sessions INNER JOIN map ON (map.customer LIKE sessions.customer) WHERE map.prr @> ARRAY['A4'] order by session_start DESC;

现在的最终结果:

       session_start        |        session_end         |    duration     | customer 
----------------------------+----------------------------+-----------------+----------
 2020-12-28 09:39:15.477601 | 2020-12-28 09:39:48.80666  | 00:00:33.329059 | Honda    
 2020-12-28 09:31:37.841083 | 2020-12-28 09:31:44.154253 | 00:00:06.31317  | Honda    
 2020-12-28 09:29:50.399863 | 2020-12-28 09:30:35.259193 | 00:00:44.85933  | bmw    

结果应该是:

       session_start        |        session_end         |    duration     | customer 
----------------------------+----------------------------+-----------------+----------
 2020-12-28 09:39:15.477601 | 2020-12-28 09:39:48.80666  | 00:00:33.329059 | Honda    
 2020-12-28 09:31:37.841083 | 2020-12-28 09:31:44.154253 | 00:00:06.31317  | Honda    
 2020-12-28 09:29:50.399863 | 2020-12-28 09:30:35.259193 | 00:00:44.85933  | bmw 
 2020-10-06 14:08:21        | 2020-10-06 14:08:23.109767 | 00:00:02.109767 | bmw-775648
 2020-10-06 13:48:44        | 2020-10-06 13:48:45.950197 | 00:00:01.950197 | honda-775648

标签: postgresqlinner-join

解决方案


||SQL 中的字符串连接运算符+是数字相加的符号。但是你已经用你内心最深处的表达有了正确的concat()表达。只需删除其他无用的东西:

JOIN map ON map.customer LIKE CONCAT('%',sessions.customer,'%')

请注意,这仅解决语法错误。我不清楚您的数据是否确实与此表达式匹配。整个数据模型似乎一开始就是错误的。


推荐阅读