У мене є таблиця, persons
яка містить два стовпці, стовпчик на id
основі JSONB і data
ця таблиця була створена для демонстраційних цілей, щоб грати з підтримкою JSON PostgreSQL).
Тепер, передбачається, він містить два записи:
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
Досить очевидно, я щось тут не отримую. На жаль, досить важко знайти будь-які реальні приклади використання JSON з PostgreSQL.
Якісь підказки?
'Jenny'
з '"Jenny"'
.
data->'name'::text
, ви кидаєте'name'
рядок до тексту, а не до результату. Ви не отримуєте помилки при порівнянні,'25'
оскільки25
це дійсна літера JSON; алеJenny
це не так (хоча"Jenny"
б і було).