我有一个名为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变量是数字,我怎样才能在所有这些场景中使用它?
答案 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数据库是强类型数据。在一列中存储不同的数据类型被广泛认为是不好的做法,因为它总是会给阅读过程带来问题。但是我们会放弃改变这种方法的可能性。所以你可以做的其他事情:
没有简单的答案。