【发布时间】:2017-03-26 19:35:14
【问题描述】:
我有一个项目列表,每个项目都有一个类别代码:
id | name | category_code
---+------------+--------------
11 | 'Cookies' | '43040'
53 | 'Potatoes' | '43100'
这些类别代码按层次排列,例如开头的 43 可能表示食物,结尾的 04 糕点或结尾的 10 根菜。
我还有一个代码名称表,如下所示:
code | name
--------+------------------------------------
'4304' | 'Food -> Pastery'
'43040' | 'Food -> Pastery -> Cookie'
'43100' | 'Food -> Root Vegetables -> Potato'
这些代码和系统不是我设计的,所以我无法影响它。就是这样。
现在的问题是,我有一个关键字到代码的映射,例如:
id | key | code
---+-----------+--------
22 | 'cookie' | '43040'
23 | 'pastery' | '4304'
24 | 'cake' | '43042'
我需要根据这些关键字进行搜索。到目前为止我尝试了什么:
SELECT item.id, item.name, category.code, category.name
FROM item
LEFT JOIN category ON category.code = item.category_code
LEFT JOIN keyword ON keyword.code = category.code
WHERE LOWER(keyword.key) = ANY(ARRAY['pastery', 'root']);
但是像JOIN category ON category.code = item.category_code这样的问题出现在中间,因为item总是有长度为5的完整代码,但是像4304这样的代码有主要类别和与之匹配的关键字。
我需要与LIKE 和% 进行连接,最好是这样:
SELECT item.id, item.name, category.code, category.name
FROM item
LEFT JOIN category ON (category.code + '%') LIKE item.category_code
LEFT JOIN keyword ON keyword.code = category.code
WHERE LOWER(keyword.key) = ANY(ARRAY['pastery', 'root']);
但显然不支持(category.code + '%')。我怎样才能以其他方式实现这一目标?
【问题讨论】:
-
可能你应该使用
LPAD函数来前缀'0'。LEFT JOIN category ON LPAD(category.code, 5, '0') = item.category_code -
category ON (category.code + '%') LIKE item.category_code应改为category ON category.code LIKE item.category_code + '%' -
@Frode
'123' LIKE '1234%'不是真的,而'123%' LIKE '1234'是。 -
@MarkusMeskanen 不在 T-SQL AFAIK 中。也许 % 在其他数据库系统中用作通配符,我不知道。试试 item.category_code LIKE category.code + '%',然后
-
抱歉,您的问题中没有看到 postgresql 标签。我的坏
标签: sql postgresql join sql-like postgresql-9.4