1

これは、ここにある私の以前の質問に似ています。 SQL で (ActiveRecord を使用して) LIKE 演算子を使用してリレーションを注文できる方法はありますか? たとえば、列の 1 つが通常多くのコンマ区切り値を含む長い文字列であるリレーションをクエリしています。前述の列の値が LIKE を使用してより小さい文字列に一致するレコードを前に並べることで、結果のリレーションを並べ替えたいと思います (たとえば、変数が「スペイン」の場合、「アイルランド、スペイン、フランス」関係の前に注文する)。

のようなものでアクティブなレコードでこれを試しましMyModel.order("country_preferences LIKE ?", country)たが、SQL エラーが発生しました。この種の注文を実行する正しい方法は何ですか?

更新(コメントから抽出):

PostgreSQL 9.1 を使用しています。現在の SQL エラー: http://pastie.org/8037147

country_preference = "アイルランド、スペイン、フランス" の 5 つのレコード、country_preference = "アイルランド、ドイツ、フランス" の 5 つのレコード。特定の国を指定して、country_preferences 文字列にこの国が含まれるレコードを先頭に並べるリレーションを返したいと考えています。

4

4 に答える 4

2

あなたの問題は、ActiveRecord がorderプレースホルダーをサポートしていないため?、手動で処理する必要があることです。このような厄介なものでうまくいくはずです:

c = ActiveRecord::Base.connection.quote(country)
MyModel.order("country_preferences LIKE '%' || #{c} || '%'")

ブール順序に依存したくない場合は、これをGoat_CO の CASEと組み合わせることができます。

于 2013-06-12T20:39:38.337 に答える
0

変数が「スペイン」の場合、「アイルランド、スペイン、フランス」のような値を持つレコードをリレーションの前に並べたいと思います。

その場合、変数に従って値に重みを割り当て、それによって並べ替えます。

 DECLARE @test NVARCHAR(20) = '%Spain%'

SELECT Column1 ,
       CASE WHEN Column1 LIKE @test
            THEN 1
            ELSE 0 
       END [Weight]
FROM Table
ORDER BY [Weight] DESC

「重み」列を表示したくない場合は、このクエリの上にサブクエリを作成し、「重み」列を除外します。

于 2013-06-12T20:45:56.980 に答える
0

たとえば、変数が「スペイン」の場合、「アイルランド、スペイン、フランス」のような値を持つレコードをリレーションの前に並べたいとします。

そのためには、case ステートメントが必要です。Rails では次のようになります。

MyModel.order("CASE WHEN country LIKE '%' || ? || '%' THEN 0 ELSE 1 END", country)

正直なところ、後者については 100% ではありません。ただし、SQL は次のようになります。

select ...
from ...
where ...
order by case
         when country like '%Spain%' then 0
         else 1
         end

ただし、これは効率的なクエリではないことに注意してください。order by 句は、基本的に、上位 10 行を取得するために効率的なインデックスが使用されないことを保証します。

于 2013-06-12T20:34:03.000 に答える
0

SQLの回答が役立つかどうかは完全にはわかりませんが、順序でCASEステートメントを使用できます.必要な基準は質問から明確ではありませんが、おそらくこれが役立ちます:

SELECT *
FROM table
ORDER BY CASE WHEN country_preference LIKE '%Ireland%' THEN 1
              WHEN country_preference LIKE '%Spain%' THEN 2
              WHEN country_preference LIKE '%France%' THEN 3
              ELSE 4
          END
于 2013-06-12T20:19:14.230 に答える