シリーズA0001、A0002、A1234、A2351などの最大数を検索しようとしています。問題は、検索しているリストにもAG108939、E092357、AL399、22-30597などの文字列があることです。など.
したがって、基本的には、データベースにHighest 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]%")
あなたは良い仕事をしました!不足しているのは、クエリの正規表現に使用される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
で正規表現を開始するので奇妙です
On Rails 4+とPostgresデータベースの場合、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で始まり、4桁が続き、文字列は終了する必要があります」と読み取ります。最後のクエリ行は次のとおりです。
@max_draw = Drawing.where("drawing_number ~* ?", '^A\d{4}$')
さらに読むRuby RegEx at RubyDoc またはよりアクセスしやすい Perlバリアント (Sublimeテキストで使用)