【问题标题】:ORACLE | SUBSTR function not working甲骨文 | SUBSTR 函数不工作
【发布时间】:2015-12-21 16:56:53
【问题描述】:

我遇到了关于 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)。

【问题讨论】:

  • 我在 oracle sql developer 中使用它,它可以正常工作。我正在这样使用它,因为我们正在测试一个自动生成的.c 查询。编辑:你是对的。复制查询是我的错。这是正常的括号。

标签: oracle substr


【解决方案1】:

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 |

【讨论】:

  • 谢谢伙计。这确实是解决方案。我会对甲骨文说,这没有意义。在该示例中使用 substr 应该等于使其等于值“0999”。不过,谢谢你的解释!
  • 使用VARCHAR2(8) 列而不是CHAR(8) 列。前者是可变长度,而后者是固定宽度。
  • 完美!就是这样。我已经根据您的 sqlfiddle 进行了测试,并且效果很好!再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多