Postgresql Postgres:如何在用户输入的每个单词上使用LIKE,并对结果进行分类

Postgresql Postgres:如何在用户输入的每个单词上使用LIKE,并对结果进行分类,postgresql,full-text-search,sql-like,Postgresql,Full Text Search,Sql Like,在postgresql 9.6中,给定类型为“alice chaplin”或“alice”或“alice chaplin meyer”但也为“lic chapl”的可变长度用户输入,我希望搜索列firstname或列lastname中包含“alice”且在firstname或lastname中包含“chaplin”且在firstname或lastname中包含“meyer”的记录,等等 我已决定使用ILIKE%searchterm%进行匹配,因此查询大致如下: ... where ((

在postgresql 9.6中,给定类型为“alice chaplin”或“alice”或“alice chaplin meyer”但也为“lic chapl”的可变长度用户输入,我希望搜索列firstname或列lastname中包含“alice”且在firstname或lastname中包含“chaplin”且在firstname或lastname中包含“meyer”的记录,等等

我已决定使用ILIKE%searchterm%进行匹配,因此查询大致如下:

... where
     ((lastname ILIKE '%' || SEARCHTERM1 || '%') OR (firstname ILIKE '%' || SEARCHTERM1 || '%')) 
 AND ((lastname ILIKE '%' || SEARCHTERM2 || '%') OR (firstname ILIKE '%' || SEARCHTERM2 || '%')) 
 AND etc.
经过大量的尝试和搜索,没有任何东西能解决这个问题。。。作为最后一种手段,我将编写一个非常程序化的pgplsql函数,该函数在分割的搜索字符串上循环,与ILIKE结果相交,但必须有一些更惯用的SQL方法来解决这样一个普通的问题。

您可以使用字符串对数组将输入字符串转换为单词数组。然后,您可以使用unnest将数组转换为虚拟表,并对要在前后添加“%”的字进行操作。最后,您可以使用ILIKE ALL SELECT使用ALL比较。。。。这一切实际上都将根据需要改变结果

WITH q AS
(
  SELECT 'Alice Chaplin Meyer'::text AS q
)
, words AS
(
SELECT 
  '%' || word || '%' AS wordish
FROM
  q
  JOIN LATERAL unnest(string_to_array(q, ' ')) AS a(word) ON true
)
SELECT
    *
FROM
    t
WHERE
    concat_ws(' ', first_name, last_name) ILIKE ALL(SELECT wordish FROM words)
你可以随时查看

参考资料:


注意:这可能可以简化,但我更喜欢一步一步的方法。

谢谢,但这给我留下了相同的问题:如何从初始搜索字符串或将搜索字符串拆分为适当数量的AND子句后生成的数组中获取。也就是说,和条款的内容不是问题所在,我上面画的那个也行。问题是如何从搜索字符串到ANDs,即单个结果的交集。我没有得到你的实际问题。。。太好了,谢谢你!请注意,您的连接是不必要的,这一行可以简化为:FROM q,unneststring_to_arrayq“,作为word,我认为我没有足够的要点来编辑您的问题以简化它{请注意上面评论的未来读者:它们是关于@joanolo答案的前一个版本,这是完全不同的。}