【问题标题】:Is it possible to use ts_stat with parameterized query Postgresql是否可以将 ts_stat 与参数化查询 Postgresql 一起使用
【发布时间】:2023-04-09 11:23:01
【问题描述】:

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

我正在寻找的是这样的:

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

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

字数

苹果 - 650025

cookie - 1500

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

谢谢!

【问题讨论】:

    标签: node.js postgresql pg word-cloud


    【解决方案1】:

    使用“格式”功能。

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

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

    【讨论】:

    • 感谢您的回复,这正是我所需要的!
    【解决方案2】:

    您可以使用WITH 子句预先创建一个虚拟表。

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

    WITH 子句为您可以在主选择中使用的特定选择创建一个虚拟临时表。

    【讨论】:

    • 感谢您的回复,但似乎术语未在 st_stat 子查询中定义。我刚刚尝试过并收到此错误:关系“条款”不存在
    猜你喜欢
    • 2022-01-05
    • 2015-11-07
    • 2019-01-25
    • 2022-06-22
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多