Postgresql查询-使用ANY查询和LIKE时,返回每个结果行的所有匹配搜索词

问题描述 投票:0回答:1

基本上,我想弄清楚的是,当运行使用ANYIN查找项目列表的查询时,是否有一种方法可以返回除匹配行之外的所有匹配搜索词。在大多数情况下,搜索词会与返回的列值完全匹配,但是在诸如文本搜索或某些扩展名(如IP4r)的情况下,情况并非总是如此。此外,您可以在一行上匹配多个搜索词。

为了具体说明,这是我的查询:

SELECT id, item_name, description FROM items WHERE description LIKE ANY('{%gaming%, %computer%, %socks%, %men%}');

它返回以下两行:

id, item_name, description
1, 'computer', 'super fast gaming computer that will help you win'
5, 'socks', 'These socks are sure to please the men in your family'

我想知道哪个原始搜索词映射到返回的结果行。换句话说,我希望返回的行看起来像这样:

id, search_terms, item_name, description
1, '{%gaming%, %computer%}', 'computer', 'super fast gaming computer that will help you win'
5, '{%socks%, %men%}', 'socks', 'These socks are sure to please the men in your family'

在PostgreSQL中是否有一种有效的方法?在上面的示例中,我们对字符串使用LIKE,但在实际情况下,我使用IP4r扩展针对CIDR范围进行IP查找,在CIDR范围内,您可以在相同的返回CIDR范围内拥有多个IP地址。

我之前问过这个问题:PostgreSQL 9.5: Return matching search terms in each result row when using LIKE,它使用CASE语句几乎解决了我在这里描述的问题。

上述情况下增加的复杂度是,您可以让多个搜索字词与一行匹配(例如gamingcomputer都与描述super fast gaming computer that will help you win匹配)。如果您使用CASE语句,则仅将CASE语句中的第一个匹配项设置为搜索项,而您错过任何其他匹配的搜索项。

谢谢您的帮助!

postgresql
1个回答
0
投票

这将是使用VALUES的方式:

SELECT i.id, i.item_name, i.description, m.pat
FROM items AS i
   JOIN (VALUES ('%gaming%'), ('%computer%'), ('%socks%'), ('%men%')) AS m(pat)
      ON i.description LIKE m.pat;
© www.soinside.com 2019 - 2024. All rights reserved.