Как решить Oracle ORA-00904 Неверный идентификатор в Union, где столбцы из разных типов данных - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть запрос, в результате которого в одном столбце с CLOB, содержащем JSON объект

select json_object( key 'casinos' VALUE                     

                      (select json_arrayagg(

                                     json_object(
                                              key 'code' VALUE cas.code, /*error invalid identifier*/
                                              key 'name' VALUE cas.name,
                                              key 'skins' VALUE  coalesce (

                                               (SELECT json_arrayagg( 


                                                json_object( key 'code' VALUE csk.code,
                                                             key 'name' VALUE csk.name

                                                             )
                                                         )              
                                                  from CASINO.CASINOCLIENTSKINS csk 
                                                  WHERE csk.casinocode = cas.code
                                                  ), '[]') 
                                                FORMAT JSON    )
                          from   ( SELECT to_char(cas.code), cas.name FROM CASINO.CASINOS cas
                                    UNION all SELECT 'default', 'Default casino' FROM DUAL
                                            ) cas
                                     ) returning clob
                     ) responseJson
FROM DUAL      

, необходимо добавить фиктивную запись, но столбец cas.code имеет тип данных NUMBER, а фиктивный столбец - VARCHAR. Преобразование cas.code в char приводит к ORA-00904 Неверный идентификатор

1 Ответ

2 голосов
/ 10 апреля 2020

В выражении SELECT у вас есть TO_CHAR(....), но вы не дали ему псевдоним. Что SELECT не выводит ни один столбец с именем CODE.

Решение простое: SELECT TO_CHAR(CAS.CODE) AS CODE, .......

РЕДАКТИРОВАТЬ

После того, как вы это сделаете, вы получите еще одну ошибку «Неверный номер». Это будет из условия соединения

WHERE csk.casinocode = cas.code

, потому что casinocode это число тип данных и cas.code это varchar2 . Теперь cas.code имеет одно значение, строку 'default', которая не может быть неявно преобразована в число.

Решение состоит в том, чтобы обернуть csk.casinocode в to_char() также, в этом состоянии.

Вопрос для вас, хотя. Поскольку вы выполняете это объединение после добавления строки «по умолчанию», а это внутреннее соединение, строка «по умолчанию» будет отброшена соединением. Итак, зачем вы вообще его добавляете?

Вы, вероятно, хотите присоединиться к external .

Как общая стратегия - вы не должны пытаться отлаживать свой код, когда он уже заключен в JSON. Вы даже не получаете желаемых результатов в качестве результата стандартного запроса SQL - сначала исправьте это, сделайте все правильно на 100%, а затем оберните результаты в JSON операторах.

...