如何在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
相关产品推荐
相关产品推荐

