У мене є таблиця, 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"б і було).