次の 3 つの行を持つ name という名前の列を持つ users テーブルがあるとします。
- アリス
- ボブ
- カール
名前が入力の部分文字列であるレコードを返すクエリを作成したいと思います。たとえば、Alice Jackson をクエリすると、Alice が必要になります。ボビーを検索したら、ボブが欲しい。しかし、Car を検索する場合、一致するものはありません。逆の並べ替えLIKE
。
これはできますか?また、ActiveRecord 構文を使用して実行できますか?
次の 3 つの行を持つ name という名前の列を持つ users テーブルがあるとします。
名前が入力の部分文字列であるレコードを返すクエリを作成したいと思います。たとえば、Alice Jackson をクエリすると、Alice が必要になります。ボビーを検索したら、ボブが欲しい。しかし、Car を検索する場合、一致するものはありません。逆の並べ替えLIKE
。
これはできますか?また、ActiveRecord 構文を使用して実行できますか?
次のようなことができます ( SQL Server 構文):
SELECT name
FROM users
WHERE 'your query' + ' ' LIKE name + ' %';
以下は Alice を検索します。
SELECT name
FROM users
WHERE 'Alice Jackson' + ' ' LIKE name + ' %';
SELECT name
FROM users
WHERE 'Alice' + ' ' LIKE name + ' %';
次の例では Alice が見つかりません。
SELECT name
FROM users
WHERE 'Ali' + ' ' LIKE name + ' %';
これを行うための SQLite の構文を理解しました。
User.where("? LIKE name || '%'", query)
SQLite での連結には二重パイプが明らかに必要です。ただし、plalx が示すように、異なる SQL サーバーは異なる方言を話すため、アプリケーション データベースはこのクエリに依存します。LIKE
最後のクエリには、ほとんどの場合、この逆の潜在的なサブセットを 10 レコード未満に制限する追加の句が含まれるため、代わりにそれらのレコードを取得し、アプリケーション レベルでマッチングを実行します。
ActiveRecordIN
式の使用:
Client.where(:name => query.split(" "))
このコードは、次のような SQL を生成します。
SELECT * FROM clients WHERE (clients.name IN ['Alice', 'Jackson']);