4

数字 (88 など) があり、Rails でプライマリ ID 列に対して LIKE クエリを実行して、ID の末尾にその数字を含むすべてのレコードを返したい場合 (IE: 88、288 など)、どうすればいいですか?結果を生成するコードは次のとおりです。これは SQLLite で正常に動作します。

@item = Item.where("id like ?", "88").all

PostgreSQL では、次のエラーが発生します。

PG::Error: ERROR:  operator does not exist: integer ~~ unknown

どうすればいいですか?数値を文字列に変換しようとしましたが、それもうまくいかないようです。

4

4 に答える 4

8

シンプルなケース

LIKE文字列/テキストタイプ用です。主キーは整数であるため、代わりに数学演算を使用する必要があります。

id100で割ったときの値の余りを取得するには、モジュロを使用します。

Item.where("id % 100 = 88")

これにより、列がで終わるItemレコードが返されますid88

1288
1488
1238872388
862388

等...

最後の2桁の任意のセットと一致します

これを動的に実行する場合(たとえば、任意の2桁のセットと照合しますが、常に2桁になることがわかっている場合)、次のように実行できます。

Item.where(["id % 100 = ?", last_two_digits)

任意のセットまたは最終桁数と一致します

任意の桁数を一致させたい場合は、それらが常に最後の桁である限り(フィールドの他の場所に表示される桁ではなくid)、モデルにカスタムメソッドを追加できます。何かのようなもの:

class Item < ActiveRecord

  ...

  def find_by_final_digits(num_digits, digit_pattern)
    # Where 'num_digits' is the number of final digits to match
    # and `digit_pattern` is the set of final digits you're looking fo

    Item.where(["id % ? = ?", 10**num_digits, digit_pattern])
  end

  ...

end

idこのメソッドを使用すると、で終わる値を見つけることができます88

Item.find_by_final_digits(2, 88)

任意の長さの最後の桁の範囲と一致します

なんらかの理由で、との間のid数字で終わるすべての値を検索したいとします。多分それらはあなたが探しているコードのいくつかの特別な範囲を表しています。これを行うには、Postgres'を使用して範囲を検索する別のカスタムメソッドを実行できます。 0912BETWEEN

def find_by_final_digit_range(num_digits, start_of_range, end_of_range)
  Item.where(["id % ? BETWEEN ? AND ?", 10**num_digits, start_of_range, end_of_range)
end

...そして以下を使用して呼び出すことができます:

Item.find_by_final_digit_range(2, 9, 12)

...もちろん、これはすべて少しクレイジーで、おそらくやり過ぎです。

于 2012-11-30T23:38:07.900 に答える
5

LIKE演算子は文字列タイプ専用です。実行しようとしていることに対してモジュロ演算子
を 使用します。%

@item = Item.where("(id % 100) = ?", "88").all

数値型を文字列に強制しますが、SQLiteで「機能する」とは思えません。パターンをリード%しないと、機能しません。
-> sqlfiddleデモ

任意の長さにキャストして、意図したとおりにtext使用します。LIKE

@item = Item.where("(id::text LIKE ('%'::text || ?)", "'12345'").all

または、数学的に:

@item = Item.where("(id % 10^(length(?)) = ?", "'12345'", "12345").all
于 2012-11-30T23:36:18.183 に答える