ORACLE | SUBSTR功能不起作用

Ric*_*tos 2 oracle substr

我有关于SUBSTR功能的问题.

想象一下表(TABLE1):

ABC_DEF   DESCRIPTION
--------  -------------
0999      TEST INFO
Run Code Online (Sandbox Code Playgroud)

如果我这样查询:

SELECT * FROM TABLE1 
WHERE 
(
     ABC_DEF = '0999'
)
Run Code Online (Sandbox Code Playgroud)

我得到了这个结果:

ABC_DEF   DESCRIPTION
--------  -------------
0999      TEST INFO
Run Code Online (Sandbox Code Playgroud)

但是,如果我这样做:

SELECT * FROM TABLE1 
WHERE 
(
     ABC_DEF = SUBSTR('00000999', 5, 4)
)
Run Code Online (Sandbox Code Playgroud)

我得到0结果.我根本不明白这种行为.属性ABC_DEF是char(8).

MT0*_*MT0 6

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

SQL小提琴

Oracle 11g R2架构设置:

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

INSERT INTO table1 VALUES ( '0999', 'TEST INFO' );
Run Code Online (Sandbox Code Playgroud)

查询1:

SELECT * FROM TABLE1 
WHERE ABC_DEF = '0999'
Run Code Online (Sandbox Code Playgroud)

结果:

|  ABC_DEF | DESCRIPTION |
|----------|-------------|
| 0999     |   TEST INFO |
Run Code Online (Sandbox Code Playgroud)

查询2:

SELECT * FROM TABLE1 
WHERE ABC_DEF = SUBSTR('00000999', 5, 4)
Run Code Online (Sandbox Code Playgroud)

结果:

问题3:

SELECT * FROM TABLE1 
WHERE ABC_DEF = RPAD( SUBSTR('00000999', 5, 4), 8, ' ' )
Run Code Online (Sandbox Code Playgroud)

结果:

|  ABC_DEF | DESCRIPTION |
|----------|-------------|
| 0999     |   TEST INFO |
Run Code Online (Sandbox Code Playgroud)