我正在尝试在ts_vector列上使用来自PostgreSQL的ts_stat。问题是我需要保护它免受SQL注入,所以我不能使用"concat“字符串或replace?将“普通查询”传递给ts_stat。
我要找的东西是这样的:
SELECT * FROM ts_stat($$ SELECT tsv_column FROM table where otherColumn ILIKE ? $$)我使用带有https://www.npmjs.com/package/pg的node.js来执行查询。最终目标是能够查询一个单词及其出现次数,如下所示:
字数统计
apple - 650025
cookie - 1500
我将使用它们作为单词云。如果您有其他想法可以帮助我做到这一点,我的想法是开放的,但它需要相当快(在一个数据库上有80,000个条目的数据库上,每列包含一个文本块,最多6秒)。现在我可以在5-6秒内得到我想要的东西,但是查询不能参数化,它需要参数化。
谢谢!
发布于 2019-11-30 04:41:13
使用“格式”功能。
SELECT * FROM ts_stat(format($$ SELECT tsv_column FROM table where otherColumn ILIKE %L $$,user_value_here));这不会保护user- protect _ or %的特殊含义,但是如果你想禁止这些特殊含义,你可能一开始就不应该使用ILIKE。
发布于 2019-11-30 00:07:44
您可以使用WITH子句来创建以前的虚拟表。
WITH terms AS (SELECT tsv_column FROM table WHERE otherColumn ILIKE ?)
SELECT * FROM ts_stat($$ SELECT tsv_column FROM terms $$);WITH子句为可以在主select中使用的特定select创建一个虚拟临时表。
https://stackoverflow.com/questions/59107733
复制相似问题