You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rust SQLx(Postgres)中绑定参数实现ILIKE子字符串查询?

解决SQLx绑定PostgreSQL ILIKE模糊查询的问题

问题根源

你当前的SQL语句里,'%$1%'中的$1被单引号包裹,PostgreSQL会把它当成普通字符串字面量,而非参数占位符,导致绑定的参数根本没生效。

解决方案一:SQL内拼接字符串

修改查询语句,用PostgreSQL的字符串连接符||把百分号和参数占位符拼起来:

const QUERY_SELECT_COUNTRY_BY_COUNTRY_NAME: &str = "SELECT * FROM dictionary_country WHERE name_en ILIKE '%' || $1 || '%'";

这样$1会被正确识别为参数占位符,绑定的字符串会和前后的%组合成模糊匹配串。

解决方案二:应用层预处理参数

在Rust代码里给输入的字符串前后加上%,再绑定到SQL的占位符上:

const QUERY_SELECT_COUNTRY_BY_COUNTRY_NAME: &str = "SELECT * FROM dictionary_country WHERE name_en ILIKE $1";

pub async fn get_country_list_by_country_name(tx: &mut Transaction<'static, Postgres>, country_name: &str) -> Result<Vec<CountryModel>, AppGenericError> {
    info!("get_country_list_by_country_name country_name = {}", &country_name);
    // 给参数添加模糊匹配的前后缀
    let like_pattern = format!("%{}%", country_name);

    match sqlx::query(QUERY_SELECT_COUNTRY_BY_COUNTRY_NAME)
        .bind(like_pattern)
        .map(|row: PgRow| CountryModel::from(row))
        .fetch_all(&mut *tx)
        .await
    {
        Ok(data) => Ok(data),
        Err(err) => Err(AppRepositoryError::general_error(err.to_string()))
    }
}

这种方式把模糊匹配的逻辑放在应用层,SQL语句更简洁,也方便统一处理参数格式。

两种方案都能实现WHERE name_en ILIKE '%Rus%'的查询效果,返回你预期的1条结果。

内容的提问来源于stack exchange,提问作者AleksandrNi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:17:12