私は、テーブルを持つpersons
2つの列が含まれている、id
とJSONBベースのdata
列を(この表は単なるPostgreSQLのJSONサポートで遊んする実演目的のために作られました)。
ここで、2つのレコードが含まれていると想定します。
1, { name: 'John', age: 30 }
2, { name: 'Jane', age: 20 }
ここで、25歳以上のすべての人の名前を取得したいとします。私が試したのは次のとおりです。
select data->'name' as name from persons where data->'age' > 25
残念ながら、これはエラーになります。の->>
代わりにを使用して解決でき->
ますが、数値は比較されないため、比較は期待どおりに機能しなくなりますが、文字列としての表現:
select data->'name' as name from persons where data->>'age' > '25'
次に、を使用->
してキャストすることで問題を実際に解決できることがわかりましたint
:
select data->'name' as name from persons where cast(data->'age' as int) > 25
これは機能しますが、実際のタイプを知る必要があるのはそれほど良くありません(age
JSONドキュメントののタイプはnumber
とにかくあるので、なぜPostgreSQLだけでそれを理解できないのですか?)。
次にtext
、::
構文を使用して手動で変換すると、すべてが期待どおりに機能することもわかりました。ただし、現在は文字列を再度比較しています。
select data->'name' as name from persons where data->'age'::text > '25'
年齢ではなく名前でこれを試しても、うまくいきません:
select data->'name' as name from persons where data->'name'::text > 'Jenny'
これはエラーになります:
タイプjsonの無効な入力構文
明らかに、私はここで何かを得ません。残念ながら、PostgreSQLでJSONを使用する実際の例を見つけるのは非常に困難です。
ヒントはありますか?
'Jenny'
しました'"Jenny"'
。
data->'name'::text
、'name'
文字列を結果ではなくテキストにキャストしています。は有効なJSONリテラルである'25'
ため、比較時にエラーが発生しません25
。しかし、そうでJenny
はありません"Jenny"
。