跨多个列搜索多个词

Multiple words search across multiple columns

我有一个简单的table:

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' 时,我只想检索最后一条记录而不是前两条。

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

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');

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