Rails SQL regular expression

后端 未结 3 911
粉色の甜心
粉色の甜心 2020-12-28 12:39

I\'m trying to search for the maximum number in the series A0001, A0002, A1234, A2351, etc... The problem is that the list I\'m searching in also has strings such as AG1089

相关标签:
3条回答
  • 2020-12-28 12:53

    On Rails 4+ with a Postgres database the general form of a RegEx query is:

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

    As for the regex, it can be a general '^A\d+$' or more specific '^A\d{4}$' Breaking it down:

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

    Basically, the regex reads "the string should start with an A, followed by four digits and then the string should end". The final query line is:

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

    Further reading on ruby RegEx at RubyDoc or the more accessible Perl variant (used by Sublime text)

    0 讨论(0)
  • 2020-12-28 13:01

    You can't use regular expressions in SQL which is what you're trying to do. Your best bet would be to select just the entries that start with A like your original code, then skip entries that have more than one letter at the beginning.

    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
    

    I'm reasonably certain it's possible to get this shorter but this should do what you need.

    (\A is the start of line anchor that works with strings containing newlines)

    ({2,} matches two or more of the proceeding character range)

    http://www.rubular.com/ is awesome for testing ruby regexes.

    0 讨论(0)
  • 2020-12-28 13:02

    You did a good job! The thing missing was the REGEXP function which is used for regex in queries:

    So in your case use

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

    In SQL you use the '-colons, which is weird because you normally start regex with /-backslashes

    0 讨论(0)
提交回复
热议问题