Rails SQL正则表达式

sab*_*ams 34 sqlite activerecord expression ruby-on-rails

我正在尝试搜索A0001,A0002,A1234,A2351等系列中的最大数字...问题是我正在搜索的列表也有字符串,如AG108939,E092357,AL399,22-30597等等......

基本上,我想在我的数据库中获得最高的####值.我使用以下查询:

@max_draw = Drawing.where("drawing_number LIKE ?", "A%")
Run Code Online (Sandbox Code Playgroud)

这种情况一直有效,直到像AG309这样的数字开始受阻,因为它以A开头,但格式与我正在寻找的格式不同.

我假设这应该是非常直接的正则表达式,但我是新来的,不知道如何正确编写这个查询与正则表达式.以下是我试过的一些东西,只需返回nil:

 @max_draw = Drawing.where("drawing_number LIKE ?", /A\d+/)
 @max_draw = Drawing.where("drawing_number LIKE ?", "/A\d+/")
 @max_draw = Drawing.where("drawing_number LIKE ?", "A[0-9]%")
Run Code Online (Sandbox Code Playgroud)

Epi*_*ene 63

在带有Postgres数据库的Rails 4+上,RegEx查询的一般形式是:

Model.where("column ~* ?", 'regex')
Run Code Online (Sandbox Code Playgroud)

至于正则表达式,它可以是一般的'^A\d+$'或更具体的'^A\d{4}$' 分解:

^ - string start anchor
A - literal "A"
\d+ - one or more digits (0-9)
\d{4} - exactly four digits
$ - string end anchor
Run Code Online (Sandbox Code Playgroud)

基本上,正则表达式读取"字符串应该以A开头,后跟四位数,然后字符串应该结束".最后的查询行是:

@max_draw = Drawing.where("drawing_number ~* ?", '^A\d{4}$')
Run Code Online (Sandbox Code Playgroud)

进一步阅读RubyDoc上的ruby RegEx 或更易于访问的Perl变体(由Sublime文本使用)

  • 为了完整起见(因为我刚刚遇到):对于不区分大小写的regexp使用`〜*`,对于区分大小写使用`~`.为了否定只是在前面添加一个"!"(`!~`和`!〜*`) (14认同)

dav*_*son 23

你做得好!缺少的是REGEXP在查询中用于正则表达式的函数:

所以在你的情况下使用

Drawing.where("drawing_number REGEXP ?", 'A\d{4}')
# the {4} defines that there have to be exactly 4 numbers, change if you need to
Run Code Online (Sandbox Code Playgroud)

在SQL中你使用'-colons,这很奇怪,因为你通常使用正则表达式/-backslashes