【问题标题】:Multiple words search across multiple columns跨多个列的多个单词搜索
【发布时间】:2021-11-24 03:39:26
【问题描述】:

我有一张简单的桌子:

CREATE TABLE contact (
    id serial NOT NULL,
    "firstName" varchar NOT NULL,
    "middleName" varchar NULL,
    "lastName" varchar NOT NULL
);

如何构造一个查询以在部分支持的所有字段中进行搜索?

假设我有以下条目:

firstName middleName lastName
John      Mark       Smith
Barbara   Alice      Johnson
John      Bob        Johson

当我搜索时:

'joh smi' 或 'smi joh' 我想检索第一条记录

但当我搜索“joh joh”时,我只想检索最后一条记录,而不是前两条。

【问题讨论】:

  • 与您的问题无关,但是:您应该真正避免使用那些可怕的带引号的标识符。他们的麻烦比他们的价值要多得多。 wiki.postgresql.org/wiki/…

标签: sql postgresql select search full-text-search


【解决方案1】:

如果你使用两个词来搜索(一个名字和一个姓氏但你不知道哪个是哪个),你可以创建一个这样的函数:

CREATE FUNCTION twoWordsSearchForContacts(words text) RETURNS SETOF contact AS
$$

DECLARE

aWords text[] := string_to_array(words, ' ');

word1 text := aWords[1];
word2 text := aWords[2];

BEGIN

  RETURN QUERY SELECT * 
               FROM contact 
               WHERE ("lastName" ILIKE '%' || word1 || '%' AND "firstName" || ' ' || "middleName" ILIKE '%' || word2 || '%')
                       OR ("lastName" ILIKE '%' || word2 || '%' AND "firstName" || ' ' || "middleName" ILIKE '%' || word1 || '%');
END;

$$ LANGUAGE plpgsql;

使用函数:

SELECT * FROM twoWordsSearchForContacts('smi joh');

您也可以不使用函数直接在查询中拆分单词。

【讨论】:

  • 谢谢,我最终想出了一些非常相似的东西,但没有使用 SQL 函数,而是使用 typescript 中的函数(在我的 ORM 服务中)。我想知道是否有可能提出一个更通用的解决方案,可以使用任意数量的字段和单词进行搜索
  • 不客气@Funkycoder!!!是的,这是可能的,但是您必须定义如何使用它们进行搜索(例如:每个单词必须出现在所有列中或仅出现在其中一个列中,等等)。
猜你喜欢
  • 2011-10-24
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
相关资源
最近更新 更多