跨多个列搜索多个词
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');
您也可以不使用函数直接在查询中拆分单词。
我有一个简单的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');
您也可以不使用函数直接在查询中拆分单词。