personsİki sütun içeren bir tablo var , bir idve bir JSONB tabanlı datasütun (bu tablo sadece gösteri amaçlı PostgreSQL'in JSON desteği ile oynamak için yapılmıştır).
Şimdi, iki kayıt içerdiğini varsayalım:
1, { name: 'John', age: 30 }
2, { name: 'Jane', age: 20 }
Şimdi, 25 yaşından büyük herkesin adını almak istiyorum varsayalım.
select data->'name' as name from persons where data->'age' > 25
Ne yazık ki, bu bir hatayla sonuçlanır. Bunu ->>yerine kullanarak çözebilirim ->, ancak daha sonra karşılaştırmalar beklendiği gibi çalışmaz, çünkü sayılar karşılaştırılmaz, ancak dizeler olarak gösterimleri:
select data->'name' as name from persons where data->>'age' > '25'
Daha sonra sorunu kullanarak ->ve bir döküm kullanarak gerçekten çözebileceğimi anladım int:
select data->'name' as name from persons where cast(data->'age' as int) > 25
Bu işe yarıyor, ama gerçek türü bilmek zorunda değilim o kadar güzel değil ( ageJSON belgesindeki türü numberzaten, bu yüzden PostgreSQL neden bunu kendi başına anlayamıyor?).
Daha sonra text, ::sözdizimini kullanarak manuel olarak dönüştürdüğümde , şimdi dizeleri tekrar karşılaştırmamıza rağmen, her şeyin de beklendiği gibi çalıştığını anladım .
select data->'name' as name from persons where data->'age'::text > '25'
Daha sonra bunu yaş yerine adıyla denerseniz, işe yaramaz:
select data->'name' as name from persons where data->'name'::text > 'Jenny'
Bu bir hatayla sonuçlanır:
json türü için geçersiz giriş sözdizimi
Açıkçası burada bir şey bulamıyorum. Ne yazık ki, PostgreSQL ile JSON kullanmanın gerçek dünyadaki örneklerini bulmak oldukça zor.
İpucu var mı?
'Jenny'ile '"Jenny"'.
data->'name'::text,'name'dizeyi sonuca değil metne döküyorsunuz. Sen karşılaştırarak bir hata alamadım'25'çünkü25geçerli bir JSON değişmezi olduğu; amaJennydeğil (olmasına rağmen"Jenny").