私のRuby on Rails app I'm using blazer( https://github.com/ankane/blazer )and私は次のSQLクエリを持っています:
SELECT *
FROM survey_results sr
LEFT JOIN clients c ON c.id = sr.client_id
WHERE sr.client_id = {client_id}
このクエリは非常にうまく機能します。ただし、client_id変数が存在するかどうかを確認するために、条件付きロジックを追加する必要があります。はいの場合はこの変数でフィルタリングし、そうでない場合はこのwhere
句を起動しません。 PostgreSQLでそれを行うにはどうすればよいですか?
Null OR次のような状態かどうかを確認してください:
WHERE {client_id} IS NULL OR sr.client_id = {client_id}
WHERE
句は次のように評価されます。変数が空の場合、WHERE
句はtrueと評価されるため、フィルターはありません。そうでない場合は、OR
の次の条件に進みます
私の解決策:
Spring Data JPA、ネイティブクエリを使用しています。
これが私のリポジトリインターフェースの署名です。 @Query(... where (case when 0 in :itemIds then true else i.id in :itemIds end) ...) List<Item> getItems(@Param("itemIds) List<Long> itemIds)
このメソッドを呼び出す前に、「itemIds」がnullかどうかを確認します。はいの場合、値を0Lに設定します:if(itemIds == null) { itemIds = new ArrayList<Long>(); itemIds.add(0L); } itemRepo.getItems(itemIds);
私のIDは1から始まるので、ID = 0の場合はありません。
psql演算子が存在しない:bigint = byteaの問題に直面した場合、これが私の回避策です:
WHERE ({client_id} < 0 AND sr.client_id > {client_id}) OR sr.client_id = {client_id}
Client_idは通常、負の値にすることはできないため、その情報を使用して操作キャストの問題を排除できることを考慮してください。