在 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
.
的更多内容
在 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
.