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

How to compare a NUMBER with VARCHAR2 type number having leading zeroes?

我正在尝试比较数据库中两个不同表中的两列。一列是 VARCHAR2(4 CHAR) 类型,另一列是 DECIMAL 类型。尽管我将这些列作为字符串拉入 JAVA 以进行比较,但我 运行 陷入了这个问题:

列中的元素(十进制)为:123、456、789

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

所以我想知道是否有一种方法可以在我从数据库中提取前缀 0 时删除它(例如某种 TRIM0()),以便两列中的元素相同?

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

您可以使用 LTRIM 从 varchar 数字中删除前导零:

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

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

您可以尝试转换,但我相信这会损害查询的性能。如果一个字母中有一个字母,它可能会导致问题

where cast(column1 as unsigned) = cast(column2 as unsigned)

(like some sort of TRIM0()) such that elements from both columns would be the same?

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

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

不要使用 LTRIM,因为它会 return 你一个 STRING,你必须将它转换为 NUMBER 以避免隐式数据类型转换。 return一个字符串是没有意义的,然后再次使用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,则必须在 设计级别。将 数字 存储为 字符类型 是一个 设计缺陷 ,除非有特定的 业务需要.