【问题标题】:How do I translate this PostgreSQL regular expression (case insensitive) query into an ILIKE query?如何将此 PostgreSQL 正则表达式(不区分大小写)查询转换为 ILIKE 查询?
【发布时间】:2021-07-04 22:08:52
【问题描述】:

我有一个当前使用 PostgresQL 的查询...

.where("locations.address ~* '#{@street_name}.*#{@street_type}'")

为了防止在执行此查找时解释特殊字符,我需要改用 ILIKE 查询。

我不确定这部分查询的作用以及如何翻译它

.*

有人能帮我理解如何在不破坏当前查询的构造方式的情况下将此查询转换为 ILIKE 查询吗?

【问题讨论】:

    标签: ruby-on-rails regex ruby postgresql


    【解决方案1】:

    在正则表达式中,. 表示“任意字符”,* 表示任意次数(包括零)。因此.* 表示包含任意长度的任意字符的字符串。

    在 Postgres 中,模式中的 % 字符(与 (I)LIKE 一起使用)表示“任何零个或多个字符的字符串”。 (docs)

    因此,当从正则表达式匹配切换到模式匹配时,只需将 .* 替换为 %


    此外(与实际问题无关),使用字符串模板创建 SQL 查询通常是一个非常糟糕的主意,因为这种方法会将您暴露给SQL injection attacks。相反,您应该使用 ORM 的变量功能。对于 ActiveRecord,您可以将值数组传递给 where,其中第一个元素是 SQL 语句模板,后续元素是要插入的变量或要插入的命名变量的散列。 (docs)

    例如:

    .where(["locations.address ILIKE ? || '%' || ?", street_name, street_type])
    

    .where(["locations.address ILIKE :street_name || '%' || :street_type", {street_name: street_name, street_type: street_type}])
    

    【讨论】:

    • 谢谢亨利 - 为了使用 ILIKE 而不是 ~* 这是否可行:.where(["locations.address ILIKE ? || '.*' || ?", street_name, street_type]) ?
    • @BenRichardson 如果您将.* 换成%,它应该会。
    猜你喜欢
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 2015-12-25
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    相关资源
    最近更新 更多