Как сравнить NUMBER с номером типа VARCHAR2 с ведущими нулями?

Я пытаюсь сравнить два столбца в двух разных таблицах базы данных. Один столбец имеет тип VARCHAR2(4 CHAR), а другой — тип DECIMAL. Хотя я ввожу эти столбцы в JAVA как строку для сравнения, я сталкиваюсь с этой проблемой:

Элементы в столбце (десятичном): 123, 456, 789

Элементы сравниваемого столбца (varchar): 0123, 0456, 0789

Итак, я хочу знать, есть ли способ удалить этот префикс 0, когда я извлекаю его из базы данных (например, какой-то TRIM0()), чтобы элементы из обоих столбцов были одинаковыми?

Я пытаюсь не обрабатывать этот столбец в самой JAVA, чтобы повысить производительность.


person JoshKni8    schedule 25.11.2015    source источник
comment
ваша проблема будет решена, если вы сравните два целых числа. Я предлагаю вам перевести varchars в int   -  person s_bei    schedule 25.11.2015
comment
Я говорю то же самое, используйте один и тот же числовой тип данных в обоих местах! LTRIM(столбец, '0')   -  person jarlh    schedule 25.11.2015
comment
@jarlh Здесь нет смысла использовать LTRIM. LTRIM для строки вернет строку. Просто используйте TO_NUMBER.   -  person Lalit Kumar B    schedule 25.11.2015


Ответы (3)


(например, какой-то TRIM0()), чтобы элементы из обоих столбцов были одинаковыми?

Ваше требование касается преобразования типов данных, а не манипулирования строками.

Элементы могут выглядеть одинаково, но важен тип данных. '123' и 123 не совпадают. Они выглядят одинаково, но это разные типы данных.

Не используйте LTRIM, поскольку это вернет вам STRING, вам придется снова преобразовать его в NUMBER, чтобы избежать неявного типа данных. конверсия. Бессмысленно возвращать строку, а затем снова использовать TO_NUMBER, чтобы преобразовать ее в число.

Правильный и эффективный способ — использовать TO_NUMBER. Это преобразовало бы его в ЧИСЛО всего за один шаг.

Например,

SQL> SELECT to_number('00123') num FROM dual;

       NUM
----------
       123

SQL> SELECT * FROM dual WHERE to_number('00123') = 123;

D
-
X

Кстати, если вы уверены, что для обработки всегда требуется ЧИСЛО из столбца, вы должны исправить это на уровне дизайна. Хранение чисел в виде символьного типа является недостатком дизайна, если только нет особой бизнес-потребности.

person Lalit Kumar B    schedule 25.11.2015

Вы можете использовать LTRIM для удаления ведущих нулей из номера varchar:

select ltrim( '0001234', '0' ) from dual;

Но я бы предложил пересмотреть ваш дизайн и сравнить число с числом.

person Mihail    schedule 25.11.2015
comment
Требование касается преобразования типа данных, а не манипулирования строками. Таким образом, ваш ответ не полностью соответствует требованию. LTRIM строки вернет строку. Таким образом, вы в конечном итоге будете сравнивать строку с числом. Зависимость от неявного преобразования типа данных снижает производительность. Вы можете сделать это за один шаг, используя TO_NUMBER. - person Lalit Kumar B; 25.11.2015

Вы можете попробовать приведение, но я считаю, что это повредит производительности запроса. И это, вероятно, вызовет проблемы, если когда-либо будет письмо в одном

where cast(column1 as unsigned) = cast(column2 as unsigned)
person Darkmere    schedule 25.11.2015
comment
Более короткая версия приведения его к числу будет использовать TO_NUMBER. Хотя вы на правильном пути, поскольку основное требование состоит в том, чтобы иметь дело с преобразованием типов данных, а не с манипулированием строками. - person Lalit Kumar B; 25.11.2015