从数字转换为字符串不能按预期工作

时间:2017-07-27 17:48:57

标签: plsql oracle11g

我有一个名为my_table的表:

Charge ch = Charge.retrieve(chargeId, requestOptions);           
Map<String, Object> captureParams = new HashMap<String, Object>();
captureParams.put("amount", (int) (amount * 100));
ch = ch.capture(captureParams);

然后我使用以下命令查询此表:P_DATA ='BOB':

| id (number) | some_data ( varchar2(3) ) |

这很好用,但是当绑定变量例如是数字010时,它什么都不返回:

SELECT * FROM my_table 
where upper(some_data) = upper(CAST(:P_DATA AS VARCHAR(3) ) ; 
// SELECT * FROM my_table where upper(some_data) = upper(CAST('BOB' AS VARCHAR(3) )

如果我在010周围加上单引号,那么它会返回数据:

SELECT * FROM my_table 
where upper(some_data) = upper(CAST(:P_DATA AS VARCHAR(3) ) ; 
// SELECT * FROM my_table where upper(some_data) = upper(CAST(010 AS VARCHAR(3) )

即使bind变量是数字,我怎样才能在所有这些场景中使用它?

1 个答案:

答案 0 :(得分:2)

问题是,数字没有显着的前导零:010 = 0010。而'010'是一个字符串,其前导零 重要:'010' != '0010'

因此,当您将数值传递给:p_data时,它没有明显的前导零,从字面上看,它们会因为数字而被剥离。因此,当您将其转换为字符串时,您会得到'10',这显然与'010'不同。这很容易证明:

SQL> select * from dual
  2  where '010' = cast(010 as varchar2(3))
  3  /

no rows selected

SQL> select * from dual
  2  where '10' = cast(010 as varchar2(3))
  3  /

D
-
X

SQL> 

至于如何解决这个问题? Oracle数据库是强类型数据。在一列中存储不同的数据类型被广泛认为是不好的做法,因为它总是会给阅读过程带来问题。但是我们会放弃改变这种方法的可能性。所以你可以做的其他事情:

  1. 添加数据类型列,告诉读者如何转换存储值。
  2. 确保将要作为数字的值存储为数字,即不存在前导零。这可能是混乱的(应用程序的其他部分可能会明确处理前导零,因此会中断)并且它将不断保持警惕。
  3. 没有简单的答案。