数字数据类型列的行为不是数字

时间:2018-02-23 16:02:36

标签: oracle

我在oracle中有一个表,其中列recid是数字类型的数据。该表是分区表,它上面有分区索引。

当我查询分区时

select * from table partition (abc)
我能够看到rec id = 50的值。但是当我查询

select * from table partition(abc) where rec id =50

它没有给出任何记录。 如果我打算输入

select * from table partition(abc) where cast (recid as number ) =50

我正在获取记录。 请让我知道可能是什么问题。 该问题仅存在于一个分区,其余分区正常工作。

2 个答案:

答案 0 :(得分:0)

如果它不是一个数字,那么它不会存储为数字。

在SQL Developer,SQLcl或SQL * Plus中对表运行DESCRIBE(DESC)。它将显示如何定义REC_ID列。

如果它存储为VARCHAR2,您将在RECETID的WHERE CLAUSE谓词上出现错误,如果不是每个REC_ID都可以被视为一个数字:

ORA-01722:无效号码

像这样:

SQL> DESC employees
Name             Null?      Type           
EMPLOYEE_ID      NOT NULL   NUMBER(6)      
FIRST_NAME                  VARCHAR2(20)   
LAST_NAME        NOT NULL   VARCHAR2(25)   
EMAIL            NOT NULL   VARCHAR2(25)   
PHONE_NUMBER                VARCHAR2(20)   
HIRE_DATE        NOT NULL   DATE           
JOB_ID           NOT NULL   VARCHAR2(10)   
SALARY                      NUMBER(8,2)    
COMMISSION_PCT              NUMBER(2,2)    
MANAGER_ID                  NUMBER(6)      
DEPARTMENT_ID               NUMBER(4)      

SQL> 
SQL> SELECT * FROM employees WHERE first_name = 50;

Error starting at line : 4 in command -
SELECT * FROM employees WHERE first_name = 50
Error report -
ORA-01722: invalid number

SQL> select * from emps_copy_num where first_name = 50;
EMPLOYEE_ID   FIRST_NAME   LAST_NAME   EMAIL   PHONE_NUMBER   HIRE_DATE   JOB_ID    SALARY   COMMISSION_PCT   MANAGER_ID   DEPARTMENT_ID   
          100 50           King        SKING   515.123.4567   17-JUN-87   AD_PRES      24000                                            90 

第一个查询失败 - 因为并非该列中的每个值都可以由数据库简单地转换为数字。

第二个查询有效,因为我创建了一个表的副本,其中所有first_name字符串都是可以作为数字强制转换的值。

答案 1 :(得分:0)

你可能在某处有空格,例如

SQL> create table t ( should_have_been_numeric   varchar2(30));

Table created.

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

1 row created.

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

1 row created.

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

1 row created.

SQL>
SQL> select * from t where should_have_been_numeric = '50';

no rows selected

SQL> select * from t where cast(should_have_been_numeric as number) = 50;

SHOULD_HAVE_BEEN_NUMERIC
------------------------------
50
   50
      50

3 rows selected.

但正如已经提到的,如果你将字符串视为数字,那么就虚假错误而言存在问题,更不用说潜在的性能问题,因为优化器也不知道这些是真正的数字。 / p>