在hstore列上编写复杂tsvector查询的另一种方法

时间:2014-03-27 21:03:53

标签: postgresql postgresql-9.2

我在hstore列上生成相当复杂的全文搜索,例如:

SELECT "users".* 
  FROM "users"  
  WHERE (
    TO_TSVECTOR('german', description -> 'de') @@ PLAINTO_TSQUERY('german', 'foobar') OR 
    TO_TSVECTOR('french', description -> 'fr') @@ PLAINTO_TSQUERY('french', 'foobar') OR 
    TO_TSVECTOR('english', description -> 'en') @@ PLAINTO_TSQUERY('english', 'foobar')
  )

由于应用层的限制,我不能把上面的SQL放在一起。我所能做的就是构建一个如下所示的查询:

WHERE [whatever] [predicate] 'foobar'

使用=谓词说:

WHERE [whatever] = 'foobar'

现在,我很确定不可能以我能在应用层处理的方式重写上面的复杂查询。但我很想在这里被证明是错误的。

感谢您的想法!

1 个答案:

答案 0 :(得分:1)

WHERE
    (TO_TSVECTOR('german', description -> 'de') @@
        PLAINTO_TSQUERY('german', 'foobar')
    )::int +
    (TO_TSVECTOR('french', description -> 'fr') @@
        PLAINTO_TSQUERY('french', 'foobar')
    )::int +
    (TO_TSVECTOR('english', description -> 'en') @@
        PLAINTO_TSQUERY('english', 'foobar')
    )::int
    > '0'

布尔值到整数的强制转换为0或1.将整数与文本进行比较时,文本将转换为整数。