我在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
我正在获取记录。 请让我知道可能是什么问题。 该问题仅存在于一个分区,其余分区正常工作。
答案 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>