1

私は.where(:attr => [val1, val2, val3])を実行することができ、それらのいずれかに一致するすべての行を返すことになります。val1-3Postgresql jsonb(Rails) - 1つのjson属性で配列を介して複数の値を照会します

私はPostgres/Postgresqlを使用しており、jsonbタイプを持っています。同様のことをしたいと思います。 PsuedoCode:.where("col @> ?", {attr: [val1, val2, val3]}.to_json)が返されますが、これは何も返しません。つまり、個々の値ではなく、配列全体の値を見つけようとしています。val1val2val3

jsonbクエリで、単一の属性として複数の値を渡す方法はありますか?

私は.where("attr @> {.. val1 ...} OR attr @> {... val2 ..} ...")を行うことができましたが、より良い方法があるようです。

https://www.postgresql.org/docs/9.4/static/functions-json.htmlからさまざまなことを試しましたが、解決策があるようです。

答えて

5

あなたは、多くの場合、ANYを使用して一般化することができOR式:

9.23.3。 ANY/SOME(配列)

expression operator ANY (array expression) 
expression operator SOME (array expression) 

だから、このような何か:

where c = any(array[1,2,3]) 

である必要はありませんオペレータ:

where c = 1 or c = 2 or c = 3 

のように書くことができます=またはもちろん、>,like、またはでも@>

where('c = any(array[?])', [1,2,3]) 

になります:

where c = any(array[1,2,3]) 

時間でプレースホルダの値が配列の場合のようなものもそう、その後、ActiveRecordのは、SQLでのカンマ区切りのリストとしてその配列を拡大していきますデータベースはそれを認識します。あなたのJSONで上記を組み合わせる

はあなたのような何か与える:

where('attr @> any(array[?]::jsonb[])', [val1, val2, val3].map(&:to_json)) 

::jsonb[]はPostgreSQLがjsonbの配列ではなく、textの配列として配列を見ていることを確認するためにキャストタイプです。

+0

甘い!私は今日それをテストし、あなたに戻ってきます! – Taysky

+0

素晴らしい作品!ありがとう! (array [?] :: jsonb []) "、[{attr:1}、{attr:2}]。map(&:to_json))' !! – Taysky

関連する問題