ORA-01722: неверный номер, но удаление оператора DECODE возвращает результаты

У меня есть SQL-запрос (ниже), где я получаю ошибку ORA-01722: неверный номер. Довольно часто.

SELECT pt.DISPLAYNAME PARAM_NAME,
  DECODE(rp.PARAMTYPE, 'POVLOC', l.PARTNAME, p.PARAM_VALUE) PARAM_VALUE
FROM schema2.OTHER_PARAMS p
JOIN schema2.TPARAMETER rp
  ON rp.R_ID = 10230
 AND p.PARAM_NAME = rp.PARAMNAME
JOIN schema2.TPARAMETER_TL pt
  ON rp.PARAMID = pt.PARAMID
 AND pt.LANGUAGE = 'en'
LEFT JOIN schema2.TPARTITION l
  ON l.PARTITION = p.PARAM_VALUE
WHERE p.F_ID = 3669
ORDER BY rp.SEQ

Как только я удаляю оператор DECODE и просто получаю столбец PARAMTYPE, я получаю результаты. 1 столбец с PARAM_NAME (столбец DISPLAYNAME), другой с PARAM_VAL (столбец PARAMTYPE). Все типы данных в DECODE — это Varchar, поэтому преобразование числа в char или наоборот невозможно. Обычно это самая распространенная причина возникновения этой ошибки с недопустимым номером.

Если это неясно из вышеизложенного, я хочу вставить некоторую логику if/then в столбец PARAMTYPE, чтобы обновить его. Я думал об использовании оператора CASE для переменной PARAMTYPE, но я не уверен, как лучше всего это сделать.


person M. Phys    schedule 21.05.2020    source источник
comment
Можете ли вы написать это как SELECT pt.DISPLAYNAME PARAM_NAME, rp.PARAMTYPE, l.PARTNAME, p.PARAM_VALUE FROM ... и сообщить результат, особенно значения rp.PARAMTYPE, l.PARTNAME, p.PARAM_VALUE (если это немного)   -  person Srinika Pinnaduwage    schedule 22.05.2020
comment
CAST paramtype в виде строки (to_char или иначе). Это проблема преобразования типов.   -  person alexherm    schedule 22.05.2020
comment
Нужно ли оборачивать CAST вокруг DECODE? Не уверен в синтаксисе   -  person M. Phys    schedule 22.05.2020
comment
Использовать функцию TO_CHAR - DECODE( TO_CHAR(rp.PARAMTYPE, 'POVLOC'), l.PARTNAME, p.PARAM_VALUE) PARAM_VALUE   -  person krokodilko    schedule 22.05.2020
comment
Являются ли F_ID и R_ID числовыми? Распространенной причиной является STRING_COL = число, которое Oracle преобразует в TO_NUMBER(STRING_COL) = число и, следовательно, рискует получить эту ошибку.   -  person Connor McDonald    schedule 25.05.2020


Ответы (1)


Если в ваших результирующих значениях DECODE есть и число, и varchar, то вы должны заставить первое из них быть varchar, чтобы избежать ошибок преобразования. В вашем случае просто замените l.PARTNAME на TO_CHAR(l.PARTNAME).

person camoreira    schedule 07.04.2021