首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Rails SQL正则表达式

Rails SQL正则表达式
EN

Stack Overflow用户
提问于 2013-11-05 05:42:16
回答 3查看 32.5K关注 0票数 44

我正在尝试搜索A0001,A0002,A1234,A2351等序列中的最大值。问题是,我搜索的列表还包含诸如AG108939、E092357、AL399、22-30597等字符串……

所以基本上,我希望我的数据库中有最高的A####值。我使用的是以下查询:

代码语言:javascript
复制
@max_draw = Drawing.where("drawing_number LIKE ?", "A%")

它一直在起作用,直到像AG309这样的数字开始妨碍我们,因为它以A开头,但它的格式与我要找的格式不同。

我假设这对于正则表达式来说应该是非常直接的,但我是新手,不知道如何用正则表达式正确地编写这个查询。下面是我尝试过的一些返回nil的方法:

代码语言:javascript
复制
 @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]%")
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-05 05:55:51

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

因此在您示例中使用

代码语言:javascript
复制
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开始正则表达式。

票数 31
EN

Stack Overflow用户

发布于 2014-10-27 20:47:03

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

代码语言:javascript
复制
Model.where("column ~* ?", 'regex')

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

代码语言:javascript
复制
^ - string start anchor
A - literal "A"
\d+ - one or more digits (0-9)
\d{4} - exactly four digits
$ - string end anchor

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

代码语言:javascript
复制
@max_draw = Drawing.where("drawing_number ~* ?", '^A\d{4}$')

RubyDoc上进一步阅读ruby RegEx或更易访问的Perl variant (由Sublime text使用)

票数 80
EN

Stack Overflow用户

发布于 2013-11-05 05:55:36

您不能在SQL中使用正则表达式,而这正是您要做的。最好的办法是像原始代码一样只选择以A开头的条目,然后跳过开头有多个字母的条目。

代码语言:javascript
复制
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正则表达式来说非常棒。

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19777720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档