是否可以将 ts_stat 与参数化查询 Postgresql 一起使用

Is it possible to use ts_stat with parameterized query Postgresql

我正在尝试在 ts_vector 列上使用 PostgreSQL 中的 ts_stat。问题是我需要保护它免受 SQL 注入,所以我不能使用 "concat" 字符串或替换 ?将 "normal query" 传递给 ts_stat

我正在寻找的是这样的东西:

SELECT * FROM ts_stat($$ SELECT tsv_column FROM table where otherColumn ILIKE ? $$)

我正在使用 node.js 和 https://www.npmjs.com/package/pg 进行查询。最终目标是能够像这样查询一个词及其出现次数:

字数 - 计数

苹果 - 650025

cookie - 1500

我会将它们用作词云。如果您有其他想法可以帮助我做到这一点,我是开放的,但它需要非常快(在一个包含一大块文本的列上有 80,000 个条目的数据库上,最多需要 6 秒)。现在我可以在 5 - 6 秒内得到我想要的东西,但是查询不能参数化,它需要参数化。

谢谢!

您可以使用 WITH 子句来创建先前的虚拟 table。

WITH terms AS (SELECT tsv_column FROM table WHERE otherColumn ILIKE ?)
SELECT * FROM ts_stat($$ SELECT tsv_column FROM terms $$);

WITH 子句为您可以在主 select.

中使用的特定 select 创建虚拟临时 table

使用"format"函数。

SELECT * FROM ts_stat(format($$ SELECT tsv_column FROM table where otherColumn ILIKE %L $$,user_value_here));

这不会保护用户提供的 _ 或 % 的特殊含义,但如果您想禁止这些特殊含义,您可能一开始就不应该使用 ILIKE。