Что такое «Ошибка: ошибка SQL: ввод анонимных составных типов не реализован» в postgresql?

Можно ли узнать, что означает эта ошибка "error: SQL error: input of anonymous composite types is not implemented"

Я получаю указанную выше ошибку ("error: SQL error: input of anonymous composite types is not implemented"), когда выполняю приведенный ниже запрос,

select *
from dev d
where not exists (select *
                  from ( 
                    select * 
                    from jsonb_array_elements_text(d.json_id -> 'sourcedepartmentId')
                    where jsonb_typeof(d.json_id -> 'sourcedepartmentId') = 'array'
                    and d.json_id -> 'sourcedepartmentId' is not null
                    union all
                    select d.json_id ->> 'sourcedepartmentId'
                    where jsonb_typeof(d.json_id -> 'sourcedepartmentId') = 'string'
                    and d.json_id -> 'sourcedepartmentId' is not null
                  )  as jdata
                  where jdata in (  '109ec13a-46bd-26fe-6b1f-c4f329c76fda', 
                                    'fcf6f607-54f7-4e7c-8a42-23b66091a435', 
                                    '2dd35f81-27ce-55eb-bd3e-e46be3a378c4', 
                                    '1b381823-1df1-4ced-8b66-baad6e2456ee' )
                  )

d.json_id -> 'sourcedepartmentId' будет иметь значения, как показано ниже,

  • только с одним значением UUID. Пример: ["ba18e414-92d3-446b-91b4-67050f891121"] или
  • несколько значений uuid в виде массива. Пример: ["45b90b79-1151-4d8c-8785-4886607524bd", "70b9de47-5e10-42a5-bf30-81c0d4efe6bd", "e1f30960-06eb-41b4-9ca7-49b389defcab", "5cb85419-7fb7-45bd-ae8c-46b3d7ab9154"] или
  • нулевое или пустое значение.

Выдержка из схемы таблицы для таблицы с именем dev,

идентификатор разработчикаИмя сотрудникаJSON-идентификатор
ef7fd5df-7881-470d-bc7d-846211df0344Том{"sourcedevIds":[],"sourcedepartmentId":["45b90b79-3457-4d8c-8567-4886602367bd"]}
345р34-2345-56ыт-78уи-343тртрфг567Джон{"sourcedevIds":["wedfrtg-3456-3trr-6887-rte45R3"],"sourcedepartmentId":["45b90b79-1050-4d8c-8785-4886607524bd", "70b9de23-5e12-42a5-bf30-81c0d4efe6bd", "501f300 -06eb-41b4-9ca7-49b456defcab", "5cb84516-7fb7-23bd-ae8c-46b3d7ab3467"]}

|345r34-2345-56yt-78ui-343trtrfg567 | Брайан | {"sourcedevIds":["wedfrtg-7890-3trr-6887-rte45R3"],"sourcedepartmentId":[]}|

Любая помощь приветствуется. Спасибо.

@BarbarosÖzhan Извините, нет. Я сделал эту ошибку здесь. Tnx за указание на это

JSONB 20.03.2022 16:42

Что такое ...? Пожалуйста, поделитесь минимальный воспроизводимый пример, чтобы мы могли, например. вставьте в dbfiddle, чтобы получить ту же ошибку. Я предполагаю, что jdata является «составным типом» (из select *) и что ... содержит некоторые нетипизированные входные параметры.

Bergi 20.03.2022 16:45

Ошибка, кажется, в многоточии.

jjanes 20.03.2022 16:47

@Bergi Берги, я обновил вопрос. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. where jdata in будет иметь список значений UUID, как показано выше. Спасибо

JSONB 20.03.2022 16:51

@jaesonBernardsha ах, да, мне кажется несоответствие типа. Я думаю, вы получите лучшее сообщение об ошибке, если попробуете явный where jdata in ('109ec36a-42bd-42fe-9b1f-c4f479c48fda'::text, …. Подсказка: тип jdata не text.

Bergi 20.03.2022 16:58

@ Берги Спасибо. Попробовал и получил ошибку operator does not exist: record = text.

JSONB 20.03.2022 18:17

@JSONB Хорошо (чтобы убедиться, что мое подозрение подтвердилось). Вы понимаете, почему это так?

Bergi 20.03.2022 18:21

@Bergi Берги, на самом деле я не уверен. Но предложенный ниже ответ, похоже, сработал, добавив псевдоним столбца. Спасибо, что изучили это.

JSONB 20.03.2022 21:02
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
8
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

«jdata» — это псевдоним таблицы, а не псевдоним столбца. Вы должны назначить псевдоним столбца, а затем использовать его. Использование псевдонима таблицы, как если бы это было имя столбца, возможно, но здесь это не то, что вам нужно, и рассматривается как составной тип.

...) as jdata(col1)
where col1 in (...

Конечно, было бы лучше назначить осмысленный псевдоним, а не просто «col1».

Другие вопросы по теме