2015-12-21 21 views
2

我遇到了有关SUBSTR功能的问题。ORACLE | SUBSTR功能不起作用

想象一下表(TABLE1):

ABC_DEF DESCRIPTION 
-------- ------------- 
0999  TEST INFO 

如果我这样做查询:

SELECT * FROM TABLE1 
WHERE 
(
    ABC_DEF = '0999' 
) 

我得到这个结果:

ABC_DEF DESCRIPTION 
-------- ------------- 
0999  TEST INFO 

但是,如果我这样做:

SELECT * FROM TABLE1 
WHERE 
(
    ABC_DEF = SUBSTR('00000999', 5, 4) 
) 

我收到0结果。我根本不了解这种行为。属性ABC_DEF是一个char(8)。

+0

我在Oracle SQL Developer中使用它和它的作品队友。我正在使用它,因为我们正在测试一个自动生成的.c查询。编辑:你是对的。我的错误在复制查询。这是正常的括号。 – Richasantos

回答

6

CHAR(8)列将右垫与空间(CHR(32))字符的值,直到它具有8.

长度SQL Fiddle

的Oracle 11g R2架构设置

CREATE TABLE table1 (ABC_DEF CHAR(8), DESCRIPTION VARCHAR2(20)); 

INSERT INTO table1 VALUES ('0999', 'TEST INFO'); 

查询1

SELECT * FROM TABLE1 
WHERE ABC_DEF = '0999' 

Results

| ABC_DEF | DESCRIPTION | 
|----------|-------------| 
| 0999  | TEST INFO | 

查询2

SELECT * FROM TABLE1 
WHERE ABC_DEF = SUBSTR('00000999', 5, 4) 

Results

查询3

SELECT * FROM TABLE1 
WHERE ABC_DEF = RPAD(SUBSTR('00000999', 5, 4), 8, ' ') 

Results

| ABC_DEF | DESCRIPTION | 
|----------|-------------| 
| 0999  | TEST INFO | 
+0

感谢队友。这确实是解决方案。我会对甲骨文说,这是没有意义的。在这个例子中使用substr应该等于它的值'0999'。不过,谢谢你的解释! – Richasantos

+0

使用“VARCHAR2(8)”列而不是“CHAR(8)”列。前者是可变长度,而后者是固定宽度。 – MT0

+0

完美!就是这样。我已经测试基于你的sqlfiddle,它完美的作品!再一次,谢谢! – Richasantos