我试图比较数据库中两个不同表中的两列。一列的类型为VARCHAR2(4 CHAR),另一列的类型为DECIMAL。虽然我将这些列作为字符串拉入JAVA进行比较,但我遇到了这个问题:
列(十进制)中的元素是:123,456,789
比较列(varchar)的元素是:0123,0456,0789
所以我想知道是否有一种方法可以删除这个带前缀的0,因为我从数据库中提取它(比如某种类型的TRIM0()),这样两列中的元素都是相同的?
我试图避免在JAVA中处理此列以提高性能。
答案 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 ,则必须在设计级处进行修复。将数字存储为字符类型是设计缺陷,除非有特定的业务需求。