Oracle.Преобразовать значение varchar "40,00" в числовое значение - PullRequest
3 голосов
/ 28 октября 2009

Например, a имеет значение varchar "40.00" и хочет использовать его с операторами ">" или "<" в предложении where. Как я могу использовать это? </p>

Ответы [ 4 ]

5 голосов
/ 28 октября 2009

Вы можете преобразовать его в число, используя функцию TO_NUMBER:

WHERE TO_NUMBER(col) > 39

Но будьте осторожны: если какая-либо строка в таблице содержит нечисловую запись в этом столбце, запрос может завершиться ошибкой:

SQL> create table t (col varchar2(10));

Table created.

SQL> insert into t values ('39.00');

1 row created.

SQL> insert into t values ('40.00');

1 row created.

SQL> insert into t values ('41.00');

1 row created.

SQL> insert into t values ('xxx');

1 row created.

SQL> select * from t where to_number(col) > 39;
ERROR:
ORA-01722: invalid number
5 голосов
/ 28 октября 2009

Вы можете преобразовать varchar в десятичное число, например:

select *
from YourTable
where CAST(YourField AS decimal) < 40.00

Или используйте функцию TO_NUMBER () :

select *
from YourTable
where TO_NUMBER(YourField) < 40.00

Если поле не всегда является числом и у вас установлена ​​сравнительно недавняя установка Oracle, вы можете выбрать строки, в которых YourField имеет числовые значения, например:

select *
from (
    select * 
    from YourTable
    where regexp_like(YourField, '^-?[[:digit:],.]+$')
) sub
where TO_NUMBER(YourField) < 40.00
4 голосов
/ 28 октября 2009

Если вы хотите сравнить их как числа, используйте функцию TO_NUMBER Oracle 11g doc

Я бы посоветовал, чтобы, если вы хотите, таким образом, относиться к числу, лучше всего изменить схему / DDL, чтобы 40,00 сохранялось в числовом поле. Это будет означать, что сравнения работают, доступ будет более эффективным, например, где field> x будет использовать индекс - где TO_NUMBER (field)> x не использует индекс, и ошибки вставки могут быть обнаружены при вставке вместо необходимости запуска отчетов для поиска нечисловых данных.

0 голосов
/ 26 мая 2016
AND (TO_NUMBER(NVL(NAME_FIELD,'0'),'99999999D999','nls_numeric_characters=,.') > 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...