#json #postgresql
Вопрос:
Я хочу фильтровать целочисленный массив в postgresql, но когда я выполняю приведенный ниже запрос, он выдает мне ошибку литерального массива неправильной формы.
select * from querytesting where 1111111111 = any((jsondoc->>'PhoneNumber')::integer[]);
Откройте изображение для справки —
https://i.stack.imgur.com/Py3Z2.png
Ответ №1:
any(x)
хочет массив PostgreSQL как x
. (jsondoc->>'PhoneNumber')
, однако, дает вам текстовое представление массива JSON. Массив PostgreSQL будет выглядеть следующим образом: текст:
'{1,2,3}'
но версия JSON, которую вы получите, ->>
будет выглядеть так:
'[1,2,3]'
Вы не можете смешивать два типа массивов.
Вместо этого вы могли бы использовать оператор JSON:
jsondoc->'PhoneNumber' @> 1111111111::text::jsonb
Использование ->
вместо ->>
дает вам массив JSON, а не текст. Затем вы можете посмотреть, есть ли номер, который вы ищете, в этом массиве @>
. Функция двойного приведения ( ::text::jsonb
) необходима для преобразования номера PostgreSQL в номер JSON для @>
оператора.
Кроме того, хранение телефонных номеров в виде номеров может быть не лучшей идеей. Вы не занимаетесь арифметикой телефонных номеров, поэтому на самом деле это вовсе не цифры, а строки, содержащие цифровые символы. Приведение формата телефонного номера в соответствие с международными стандартами, а затем обращение с ними как со строками, вероятно, послужит вам лучше в долгосрочной перспективе.