Rails SQL正则表达式

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

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

@max_draw = Drawing.where("drawing_number LIKE ?", "A%") 

这种情况一直有效,直到像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]%") 

你做得好! 缺少的是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 

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

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

 Model.where("column ~* ?", 'regex') 

至于正则表达式,它可以是一般'^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 

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

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

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

您不能在SQL中使用正则表达式,这是您正在尝试执行的操作。 您最好的选择是选择与原始代码一样的以A开头的条目,然后跳过开头有多个字母的条目。

 items = Drawing.where( [ 'drawing_number LIKE ?' , 'A%' ] ) max_value = 0 items.each do |item| next if item.drawing_number =~ /\A[A-Za-z]{2,}/ drawing_number = item.drawing_number.gsub(/\AA/, '').to_i max_value = drawing_number if drawing_number > max_value end 

我有理由相信它可以缩短,但这应该做你需要的。

(\ A是使用包含换行符的字符串的行锚点的开头)

({2,}匹配两个或更多的前进字符范围)

http://www.rubular.com/非常适合测试ruby正则表达式。