persons
İki sütun içeren bir tablo var , bir id
ve bir JSONB tabanlı data
sü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 ( age
JSON belgesindeki türü number
zaten, 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ü25
geçerli bir JSON değişmezi olduğu; amaJenny
değil (olmasına rağmen"Jenny"
).