我正在尝试搜索A0001,A0002,A1234,A2351等序列中的最大值。问题是,我搜索的列表还包含诸如AG108939、E092357、AL399、22-30597等字符串……
所以基本上,我希望我的数据库中有最高的A####值。我使用的是以下查询:
@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]%")
发布于 2013-11-05 05:55:51
你做得很好!缺少的是用于查询中正则表达式的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
开始正则表达式。
发布于 2014-10-27 20:47:03
在带有Postgres数据库的Rails 4+上,RegEx查询的一般形式为:
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 variant (由Sublime text使用)
发布于 2013-11-05 05:55:36
您不能在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正则表达式来说非常棒。
https://stackoverflow.com/questions/19777720
复制相似问题