2013-04-12 4 views
1

Вот оно.
У меня есть две таблицы: «Приложение и отчет».
В таблицах есть общий столбец (appId, внешнийAppId соответственно), который можно соединить, чтобы найти уникальные значения.
Мои проблемы, когда я присоединяюсь к этим двум таблицам, я получаю значения, которых я действительно не хочу.

Примерные значения
Точные значения совпадения при соединении оракула

Application Report 
No appId  ReportNo ExternalAppId 
1 123   1  123 
2 456   2  0000
3 789   3  321 

Так что, когда я говорю Application.appId = Report.ExternalAppId в моем где состояние, она возвращается мне строки 123 и 0000из отчетов таблицы.
Ведущие нули не учитываются в соединении.
Мне нужен результат только с точными совпадениями.
В этом случае только первая строка. Причиной проблемы, которую я считаю, является appId, является номер, а ExternalAppId - varchar.
Я тоже не могу изменить это. Есть ли обходной путь?
Я видел регулярное выражение, которое может удалить ведущие нули и затем совпадать, но просто хочу знать, есть ли лучшее решение.
т.е. могу ли я указать, что соединение будет работать только для значений с точным соответствием?

ответ

4

Oracle может сравнивать только два значения с одним и тем же типом данных. Я не могу этого достаточно подчеркнуть. Фактически большинство языков могут сравнивать два значения только в том случае, если они являются одним и тем же типом данных. Отношения в математике также будут определены с объектами одного типа (так что вы можете определить transitivity, reflexivity ...). Есть также высказывание с апельсинами и яблоками: не пытайтесь их сравнить.

Так что, когда вы попросите Oracle сравнить два значения разных типов данных, произойдет неявное преобразование. В большинстве случаев вам следует избегать этих преобразований, поскольку правила, по которым тип данных будет выбран по другому, могут быть довольно сложными и (как в этом случае) будут часто создавать ошибки, потому что вы неправильно догадаетесь, какой тип будет выиграть. Вы должны полагаться на явные преобразования (указанные вами конверсии).

Я предполагаю, что Application (appId) является NUMBER и Report (ExternalAppId) имеет тип VARCHAR2. В этом случае Oracle решила преобразовать ExternalAppId в NUMBER, а в поле NUMBER - 00123=123, поскольку номера не имеют формата.

Вы должны быть написаны вместо вашего присоединиться условие как:

to_char(application.appId) = report.externalAppId 
+0

Именно то, что я искал. Я знал, что что-то не так с этим соединением. Большое спасибо ! – jijo

+0

Но я все еще удивляюсь, почему Oracle позволяет пользователю делать это, вместо того, чтобы бросать синтаксическую ошибку или что-то во время выполнения запроса, как и все другие языки программирования. – jijo

+0

@jijo Вы должны знать тип данных ваших столбцов. Нет ничего важнее данных в базе данных :) Также это может быть рекомендация ANSI, поскольку [Mysql ведет себя так) (http://sqlfiddle.com/#!2/f0f7f/1), [SQLLite] (http : //sqlfiddle.com/#! 7/f0f7f/1) также и [SQL Server] (http://sqlfiddle.com/#!6/f0f7f/1). Только [PostgreSQL] (http://sqlfiddle.com/#!12/f0f7f/1) вызывает ошибку. –

Смежные вопросы