柴油查询中的“听起来像”

Posted

技术标签:

【中文标题】柴油查询中的“听起来像”【英文标题】:"SOUNDS LIKE" in diesel query 【发布时间】:2021-05-10 00:00:33 【问题描述】:

我想使用 mysql 的“SOUNDS LIKE”查询一个字段。

SQL:

WHERE field SOUNDS LIKE "blah"

如何用柴油框架查询这个?

我想到了

.filter(sql("field SOUNDS LIKE ???"))

但是如何通过正确的转义在这里注入 (bind()) 我的值?

或者有没有更好的方法来使用不受支持的 SQL 进行过滤?

EDIT1:

我找到了 infix_operator 宏,但它不起作用。找不到SqlTypeTypedExpressionType 和 infix_operator 宏。但根据 Github,它就在那里:

use diesel::sql_types::SqlType;
use diesel::expression::TypedExpressionType;
use diesel::expression::AsExpression;
use diesel::expression::Expression;

diesel::infix_operator!(SoundsLike, " SOUNDS LIKE ");

fn sounds_like<T, U, ST>(left: T, right: U) -> SoundsLike<T, U::Expression>
where
    T: Expression<SqlType = ST>,
    U: AsExpression<ST>,
    ST: SqlType + TypedExpressionType,

    SoundsLike::new(left, right.as_expression())

【问题讨论】:

.filter(sql("field SOUNDS LIKE 'blah'"))? 该值来自用户输入(=变量)。认为这很明显:-) 【参考方案1】:

我找到了 infix_operator 宏,但它不起作用。未找到 SqlType、TypedExpressionType 和 infix_operator 宏。但根据 Github,它就在那里:

这是因为您查看了 master 分支,其中包含未发布的更改。其中之一是将 diesel::infix_operator!diesel_infix_operator! 重命名 通过使用最新版本的变体,您的代码应该可以正常工作:

#[macro_use] extern crate diesel;

use diesel::expression::AsExpression;
use diesel::expression::Expression;

diesel_infix_operator!(SoundsLike, " SOUNDS LIKE ");

fn sounds_like<T, U, ST>(left: T, right: U) -> SoundsLike<T, U::Expression>
where
    T: Expression<SqlType = ST>,
    U: AsExpression<ST>,

    SoundsLike::new(left, right.as_expression())

【讨论】:

仍然找不到SqlType和TypedExpressionType。使用柴油 1.4.5。 AsExpression 和 Expression 都可以。 没错,我错过了。代码现已修复,应该可以在 1.4.5 版本中正常工作。【参考方案2】:

您可以使用bind方法绑定参数:

table.filter(sql("SOUNDS LIKE ").bind::<Text, _>(input);

【讨论】:

没有那么优雅,因为我必须对表和字段名称进行硬编码。但它有效。谢谢

以上是关于柴油查询中的“听起来像”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用柴油进行 IN 查询?

如何选择带有柴油 rs 的列子集?

在柴油机中执行正确连接

柴油文档中的 `tags` 变量来自啥?

柴油中的显式 JOIN ON

在mysql中连接三张表ABC,并返回A中的共同点。