Я получаю ошибку Oracle Invalid Number
, которая не имеет смысла для меня.Я понимаю , что означает эта ошибка , но это не должно происходить в этом случае.Извините за длинный вопрос, но, пожалуйста, потерпите меня, чтобы я смог это подробно объяснить.
У меня есть таблица, в которой идентификаторы хранятся в разных источниках, а некоторые идентификаторы могут содержать буквы.Поэтому столбец имеет вид VARCHAR
.
. Один из источников имеет числовые идентификаторы, и я хочу присоединиться к этому источнику:
SELECT *
FROM (
SELECT AGGPROJ_ID -- this column is a VARCHAR
FROM AGG_MATCHES -- this is the table storing the matches
WHERE AGGSRC = 'source_a'
) m
JOIN SOURCE_A a ON a.ID = TO_NUMBER(m.AGGPROJ_ID);
В большинстве случаев это работает, но в зависимости отна случайных вещах, таких как столбцы в предложении select, если он использует левое или внутреннее соединение и т. д., я начну видеть ошибку Invalid Number
.
Я неоднократно проверял, что всезаписи в AGG_MATCHES
, где AGGSRC = 'source_a'
не содержат нецифровых символов в столбце AGGPROJ_ID
:
-- this returns no results
SELECT AGGPROJ_ID
FROM AGG_MATCHES
WHERE AGGSRC = 'source_a' AND REGEXP_LIKE(AGGPROJ_ID, '[^0-9]');
Я знаю, что Oracle в основном переписывает запрос для оптимизации.Возвращаясь к первому примеру SQL, я думаю, что в зависимости от того, как написан весь запрос, в в некоторых случаях Oracle пытается выполнить JOIN перед подзапросом.Другими словами, он пытается объединить все таблицы AGG_MATCHES
в SOURCE_A
вместо только подмножества, возвращаемого подзапросом.Если это так, в столбце AGGPROJ_ID
будут строки, содержащие не числовые значения.
Кто-нибудь наверняка знает, является ли это причиной ошибки?Если это причина, могу ли я в любом случае заставить Oracle сначала выполнить часть подзапроса, поэтому он пытается присоединиться только к подмножеству таблицы AGG_MATCHES
?
Немногодополнительная справочная информация:
Это, очевидно, упрощенный пример для иллюстрации проблемы.Таблица AGG_MATCHES
используется для хранения «совпадений» между различными источниками (например, проектами).Другими словами, используется, чтобы сказать, что проект в sourceA сопоставлен с проектом в sourceB.
Вместо того, чтобы писать один и тот же SQL снова и снова, я создал представления для источников, которые мы обычно используем.Идея состоит в том, чтобы иметь представление с двумя столбцами, один для SourceA и один для SourceB.По этой причине я не хочу использовать TO_CHAR
в столбце ID
исходной таблицы, потому что разработчики должны помнить об этом каждый раз, когда они выполняют соединение, и я пытаюсь удалить коддублирования.Кроме того, поскольку идентификатор в SOURCE_A
является числом, я считаю, что любое представление, хранящее SOURCE_A.ID
, должно преобразиться в число.