如何将NUMBER与具有前导零的VARCHAR2类型编号进行比较?

时间:2015-11-25 13:42:00

标签: sql oracle numbers type-conversion varchar

我试图比较数据库中两个不同表中的两列。一列的类型为VARCHAR2(4 CHAR),另一列的类型为DECIMAL。虽然我将这些列作为字符串拉入JAVA进行比较,但我遇到了这个问题:

列(十进制)中的元素是:123,456,789

比较列(varchar)的元素是:0123,0456,0789

所以我想知道是否有一种方法可以删除这个带前缀的0,因为我从数据库中提取它(比如某种类型的TRIM0()),这样两列中的元素都是相同的?

我试图避免在JAVA中处理此列以提高性能。

3 个答案:

答案 0 :(得分:2)

您可以使用LTRIM从varchar编号中删除前导零:

select ltrim( '0001234', '0' ) from dual;

但我建议您重新审视您的设计并将数字与数字进行比较。

答案 1 :(得分:1)

您可以尝试投射,但我相信这会损害查询的性能。如果在一个

中有一封信,这将导致问题
where cast(column1 as unsigned) = cast(column2 as unsigned)

答案 2 :(得分:0)

  

(就像某种TRIM0()),这两列的元素是相同的吗?

您的要求是关于数据类型转换,而不是字符串操作。

元素可能看起来很相似,但重要的是数据类型'123'123不一样。它们看起来很相似,但它们是不同的数据类型。

请勿使用 LTRIM ,因为它会返回 STRING ,您必须再次将其转换为 NUMBER 以避免隐式数据类型转换。返回一个字符串是没有意义的,然后再次使用TO_NUMBER将其转换为数字。

正确有效的方法是使用 TO_NUMBER 。它只需一步即可将其转换为NUMBER。

例如,

SQL> SELECT to_number('00123') num FROM dual;

       NUM
----------
       123

SQL> SELECT * FROM dual WHERE to_number('00123') = 123;

D
-
X

另外,如果您确定要处理的列中始终需要 NUMBER ,则必须在设计级处进行修复。将数字存储为字符类型设计缺陷,除非有特定的业务需求