2016-04-11 29 views
0

Diyelim ki "tarifler" tablosu için "veri" adı verilen bir jsonb sütun türüm var. "Veriler" dolu olan tüm kayıtları bulmaya çalışıyorum (örneğin "veri" boş değil veya boş bir ayraç {}).PostgreSQL'i kullanarak, jsonb sütunu dolu olan tüm kayıtları nasıl bulabilirim?

Ben Ruby kullandığımız hstore sütunlar için biliyorum, bunu yapmak için böyle bir sorgu kullanabilirsiniz: jsonb için eşdeğer sorgu

Recipe.where("data <> ''") 

var mı?

cevap

1

düzgün soru okuduktan sonra Güncelleme:

Bu

SELECT * FROM table WHERE json_column IS NOT NULL 

gibi YOK verilerle sütunlar için kontrol edebilirsiniz

Yani bu daha sonra

Recipe.where.not('data IS NULL') 

olurdu Ve olmayan ile sütunlar için Boş karma şunun gibi:

SELECT * FROM table WHERE json_column(Böylece AR ve SQL Ruby çevirisini kaçının) sorgu ilk SQL onları çalıştırmaktır doğrulamak için

Recipe.where('data <> ?', '{}') 
# or 
Recipe.where("data <> '{}'") 

İyi bir şekilde:> '{}'

Bu çevirir. Ardından sorguyu AR'de oluşturmayı deneyebilir ve sorgularınızın AR'yi ne yaptığını görmek için to_sql'u kullanabilirsiniz.

Recipe.where('data <> ?', '{}').to_sql 
#=> "SELECT \"recipies\".* FROM \"recipies\" WHERE (data <> '{}')" 

vs

Recipe.where('data <> ?', {}).to_sql 
#=> "SELECT \"recipies\".* FROM \"recipies\" WHERE (data <> NULL)" 
+0

Merhaba Pascal. Evet, bunu denedim ancak boş köşeli parantezler içeren tarifleri topluyor {}. Bu, özellikle kullandığım çizgi: Recipe.where.not ('data IS NULL'), harita {| x | x.data}, ve boş köşeli parantezleri içeren öğeleri döndürüyor: [{}, { }, {}, {}, {}, {}, {}, {"abc" => "123"}, {}] – sjsc

+0

Merhaba sjsc cevabı güncelledim. Soruyu düzgün bir şekilde okumadım :-( –

+0

Merhaba Pascal: Maalesef hala maalesef almıyorum :-(Recipe.where'i ('data <>?', {}) Denediğimde, bazılarına rağmen iade kayıtları alamıyorum. Benim girişlerim boş olmayan karma içerir. (Rails 4.2.6, postgresql 9.5 ve ruby ​​2.3.0 kullanıyorum.) – sjsc

İlgili konular