44

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

3 に答える 3

80

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}$')

RubyDocまたはよりアクセスしやすいPerl バリアント(Sublime text で使用)のruby​​ RegEx に関する詳細情報

于 2014-10-27T12:47:03.017 に答える
32

あなたはよくやった!不足していたのは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

于 2013-11-04T21:55:51.240 に答える
-3

あなたがしようとしている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,} は、先行する文字範囲の 2 つ以上に一致します)

http://www.rubular.com/は Ruby の正規表現をテストするのに最適です。

于 2013-11-04T21:55:35.727 に答える