web-dev-qa-db-ja.com

Rails SQL正規表現

シリーズ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]%")
33
sabrams

あなたは良い仕事をしました!不足しているのは、クエリの正規表現に使用される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で正規表現を開始するので奇妙です

22
davegson

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テキストで使用)

60
Epigene