甲骨文。将varchar值“40.00”转换为数字

时间:2009-10-28 09:51:26

标签: sql oracle

例如,a varchar值为“40.00”,并希望将其与运算符“>”一起使用或“<”在where子句中。我该如何使用它?

4 个答案:

答案 0 :(得分:5)

您可以将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

答案 1 :(得分:5)

您可以使用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

答案 2 :(得分:4)

如果您想将它们作为数字进行比较,请使用TO_NUMBER函数Oracle 11g doc

我建议如果你想这样对待一个数字,最好的方法是改变你的架构/ DDL,以便40.00存储在一个数字字段中。这意味着比较工作,访问更有效,例如where field&gt; x将使用索引 - 其中TO_NUMBER(字段)&gt; x不使用索引,并且可以在插入时捕获数据错误,而不必运行报表来查找非数字数据。

答案 3 :(得分:0)

AND (TO_NUMBER(NVL(NAME_FIELD,'0'),'99999999D999','nls_numeric_characters=,.') > 0)