内部加入 LIKE 条件

inner join with LIKE condition

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

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

现在这给了我结果,但遗漏了一些客户的名字。 我在会话 table 中有客户名称,如: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

SQL中的字符串连接运算符是||+符号用于添加数字。 但是你已经有了最内层 concat() 表达式的正确表达式。把其他没用的东西去掉:

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

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