内部加入 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-888
和 bmw
它会显示两者。
我试过那里的陈述,但它没有给我我需要的结果或给出了错误:
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,'%')
请注意,这仅解决了语法错误。我不清楚您的数据是否真的匹配这个表达式。整个数据模型似乎从一开始就是错误的。
我正在使用 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-888
和 bmw
它会显示两者。
我试过那里的陈述,但它没有给我我需要的结果或给出了错误:
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,'%')
请注意,这仅解决了语法错误。我不清楚您的数据是否真的匹配这个表达式。整个数据模型似乎从一开始就是错误的。