使用 PostgreSQL 在 SORM 中进行非敏感搜索

Posted

技术标签:

【中文标题】使用 PostgreSQL 在 SORM 中进行非敏感搜索【英文标题】:Non sensitive search in SORM with PostgreSQL 【发布时间】:2015-03-03 17:54:20 【问题描述】:

如何使用 SORM 和 PostgreSQL 在数据库中进行非敏感搜索? 我试过whereLike

DB.query[User].whereLike("fullname", "%" + term + "%").fetch() 

这将执行区分大小写的搜索。 PostreSQL 支持ILIKE 运算符,但在SORM DSL API 中没有找到ILIKE 函数。

我也试过whereRegex

DB.query[User].whereRegex("fullname", term).fetch()

这会返回一个错误:

org.postgresql.util.PSQLException: ERROR: syntax error at or near "REGEXP"

Acording 到文档 PostgreSQL 不使用 REGEXP 运算符,它使用 ~ (tilda) 运算符。据我了解,这会导致错误。我想用正则表达式执行这样的事情:

SELECT "fullname" FROM "user" WHERE "fullname" ~ 'john';

谢谢!

【问题讨论】:

【参考方案1】:

在 Postgres 中不工作的正则表达式是一个错误,现已在 0.3.17 版中修复。感谢您发现这一点。

关于区分大小写,看起来 Postgres 对正则表达式也使用了不同的运算符。嗯。看起来目前没有办法用 Postgres 做到这一点。 SORM 需要引入合适的算子,欢迎贡献。

【讨论】:

感谢您的回复。我添加了 IgnoreCaseLike 运算符,它在 PostgreSQL 数据库中创建 ILIKE 并在 GitHub 上创建拉取请求。如果您会查看它并接受代码是否正常,我会很感激,我在当前的项目中确实需要它:) 同时我发现创建一个适用于所有数据库的 IgnoreCaseLike 很棘手,因为 PostgreSQL 使用 ILIKE,mysql 使用 LIKE默认情况下不敏感,H2 和 HSQLDB 使用 lower/upper 函数在搜索中忽略大小写。

以上是关于使用 PostgreSQL 在 SORM 中进行非敏感搜索的主要内容,如果未能解决你的问题,请参考以下文章

SORM:如何在 Scala 2.11.6 中使用 Sorm

如何在 SORM 中使用连接表?

如何在 PostgreSQL 中进行大型非阻塞更新?

在 Play Framework 2.3.8 中使用 SORM

无法使用 sorm 访问字段

如何从 SORM 表定义中排除类字段?