ОШИБКА: неправильный литерал массива в PostgreSQL

#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 для @> оператора.


Кроме того, хранение телефонных номеров в виде номеров может быть не лучшей идеей. Вы не занимаетесь арифметикой телефонных номеров, поэтому на самом деле это вовсе не цифры, а строки, содержащие цифровые символы. Приведение формата телефонного номера в соответствие с международными стандартами, а затем обращение с ними как со строками, вероятно, послужит вам лучше в долгосрочной перспективе.