在 PostgreSQL 中跨多列搜索时如何获取匹配的列名?

How to get the matching column name when searching across multiple columns in PostgreSQL?

在 PostgreSQL 中搜索多列时,有没有办法获取匹配的列名?

假设我有以下 table 结构和查询:

CREATE TABLE document (
    id serial PRIMARY KEY,
    document_content VARCHAR
);

CREATE TABLE story (
    id serial PRIMARY KEY,
    headline VARCHAR
);

-----

SELECT
    "document".*,
    story.id,
    story.headline
FROM
    "document"
INNER JOIN story_document AS Documents_join ON "document".id = Documents_join.document_id
INNER JOIN story ON  "story".id = Documents_join.story_id
WHERE to_tsvector(document_content) @@ to_tsquery('foo')
OR to_tsvector(headline) @@ to_tsquery('foo');

我正在考虑连接两列的值,运行 全文搜索,然后分别为两列和 re-run 搜索创建一个子查询,并将结果记录为参考,但这意味着执行搜索 3x:

SELECT
    "document".*,
    story.id AS story_id,
    story.headline
    (SELECT "document".id WHERE to_tsvector(document_content) @@ to_tsquery('foo')) AS "matching_document_id",
    (SELECT story_id WHERE to_tsvector(headline) @@ to_tsquery('foo')) AS "matching_story_id"
FROM
    "document"
INNER JOIN story_document AS Documents_join ON "document".id = Documents_join.document_id
RIGHT JOIN story ON "story".id = Documents_join.story_id
WHERE to_tsvector(document_content || ' ' || headline) @@ to_tsquery('foo');

如何获得对列的引用:document_content 或标题,在一个查询中找到关键字“foo”?

谢谢!

由于列位于不同的表中,您最好将 OR 转换为 UNION:

SELECT
    "document".*,
    story.id,
    story.headline
FROM
    "document"
INNER JOIN story_document AS Documents_join ON "document".id = Documents_join.document_id
INNER JOIN story ON  "story".id = Documents_join.story_id
WHERE to_tsvector(document_content) @@ to_tsquery('foo')
UNION
SELECT
    "document".*,
    story.id,
    story.headline
FROM
    "document"
INNER JOIN story_document AS Documents_join ON "document".id = Documents_join.document_id
INNER JOIN story ON  "story".id = Documents_join.story_id
WHERE to_tsvector(headline) @@ to_tsquery('foo');

这样 PostgreSQL 就不必为了过滤掉大部分行而构建完整的连接。如果条件是选择性的和索引的,并且您在连接条件上也有索引,那么我的变体将会很快,这样您就可以获得快速的嵌套循环连接。

Here 是关于处理 OR.

的更多内容