如何将 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,则必须在 设计级别。将 数字 存储为 字符类型 是一个 设计缺陷 ,除非有特定的 业务需要.
我正在尝试比较数据库中两个不同表中的两列。一列是 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,则必须在 设计级别。将 数字 存储为 字符类型 是一个 设计缺陷 ,除非有特定的 业务需要.