Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql tsvectors的串联会导致Postgres 9.4.6中的语法错误_Sql_Postgresql_Postgresql 9.4_Lateral Join - Fatal编程技术网

Sql tsvectors的串联会导致Postgres 9.4.6中的语法错误

Sql tsvectors的串联会导致Postgres 9.4.6中的语法错误,sql,postgresql,postgresql-9.4,lateral-join,Sql,Postgresql,Postgresql 9.4,Lateral Join,在SQL查询中从setweight连接tsvectors时,会引发语法错误: 如果我尝试使用由setweight返回的单个tsvector,并且如果我尝试在另一个to_tsvector调用中包装整个内容,它会出现错误,原因是没有to_tsvector(tsvector)函数,因此串联确实形成了一个tsvector SELECT *, ts_rank_cd(textsearch, query) AS score FROM products, plainto_tsquery('awesome shi

在SQL查询中从setweight连接tsvectors时,会引发语法错误:

如果我尝试使用由
setweight
返回的单个tsvector,并且如果我尝试在另一个
to_tsvector
调用中包装整个内容,它会出现错误,原因是没有
to_tsvector(tsvector)
函数,因此串联确实形成了一个tsvector

SELECT *, ts_rank_cd(textsearch, query) AS score
FROM products, plainto_tsquery('awesome shirt') query, 
   setweight(to_tsvector(coalesce(title, '')), 'A') ||
   setweight(to_tsvector(coalesce(description, '')), 'B') ||
   setweight(to_tsvector(coalesce(tags, '')), 'C') ||
   setweight(to_tsvector(coalesce(vendor, '')), 'D') textsearch
WHERE shop_url='somedomain.com' AND query @@ textsearch
ORDER BY score DESC
LIMIT 20 OFFSET 0;

我曾尝试将其包装在子查询中,但这会使其成为记录,这会导致
ts\u rank\u cd
出现问题,因为它希望
textsearch
为tsvector类型。我怎样才能让这个concatedtsvector在这个查询中工作

假设列
标题
说明
等应返回到表
产品

您看到的语法错误与文本搜索本身无关。这应该起作用:

SELECT *, ts_rank_cd(textsearch, query) AS score
FROM   products
CROSS  JOIN LATERAL plainto_tsquery('awesome shirt') query
CROSS  JOIN LATERAL (
   SELECT setweight(to_tsvector(coalesce(title      , '')), 'A')
       || setweight(to_tsvector(coalesce(description, '')), 'B')
       || setweight(to_tsvector(coalesce(tags       , '')), 'C')
       || setweight(to_tsvector(coalesce(vendor     , '')), 'D')
   ) ts (textsearch)
WHERE  ...
为什么? 因为:

SELECT ...
FROM   products, plainto_tsquery('awesome shirt') query ...
FROM
子句中的隐式
交叉连接侧向
。对于函数,可以省略
横向
关键字。逗号大部分(见末尾的链接)相当于一个
交叉连接

这也适用于:

SELECT ...
FROM   products
     , plainto_tsquery('awesome shirt') query
     , setweight(to_tsvector(coalesce(title, '')), 'A')  -- just another function
...
因此:

如果我尝试使用setweight返回的单个tsvector,效果会很好

但是对于其他表达式不允许使用相同的简短语法,如
setweight(…)| setweight(…)
。这些需要包装在一个
SELECT
语句中,该语句需要一个显式的
LATERAL
关键字,以允许引用
FROM
列表中的“LATERAL”表。就像上面演示的那样。或简称:

SELECT *, ts_rank_cd(textsearch, query) AS score
FROM   products
     , plainto_tsquery('awesome shirt') query
     , LATERAL (
   SELECT setweight(to_tsvector(coalesce(title      , '')), 'A')
       || setweight(to_tsvector(coalesce(description, '')), 'B')
       || setweight(to_tsvector(coalesce(tags       , '')), 'C')
       || setweight(to_tsvector(coalesce(vendor     , '')), 'D')
   ) ts (textsearch)
WHERE  ...
关于
交叉连接
横向连接
的更多解释的相关答案:


谢谢!这似乎现在起作用了。这就解释了为什么单函数调用不会导致语法错误。
SELECT *, ts_rank_cd(textsearch, query) AS score
FROM   products
     , plainto_tsquery('awesome shirt') query
     , LATERAL (
   SELECT setweight(to_tsvector(coalesce(title      , '')), 'A')
       || setweight(to_tsvector(coalesce(description, '')), 'B')
       || setweight(to_tsvector(coalesce(tags       , '')), 'C')
       || setweight(to_tsvector(coalesce(vendor     , '')), 'D')
   ) ts (textsearch)
WHERE  ...