Sql 如何将一个数字与具有前导零的VARCHAR2类型数字进行比较?
我试图比较数据库中两个不同表中的两列。一列的类型为VARCHAR2(4个字符),另一列的类型为DECIMAL。虽然我将这些列作为字符串拉入JAVA进行比较,但我遇到了以下问题: 列(十进制)中的元素为:123456789 比较列(varchar)的元素为:0123、0456、0789 因此,我想知道是否有一种方法可以在从数据库中提取前缀0时将其删除(类似于某种TRIM0()),从而使两列中的元素相同Sql 如何将一个数字与具有前导零的VARCHAR2类型数字进行比较?,sql,oracle,numbers,type-conversion,varchar,Sql,Oracle,Numbers,Type Conversion,Varchar,我试图比较数据库中两个不同表中的两列。一列的类型为VARCHAR2(4个字符),另一列的类型为DECIMAL。虽然我将这些列作为字符串拉入JAVA进行比较,但我遇到了以下问题: 列(十进制)中的元素为:123456789 比较列(varchar)的元素为:0123、0456、0789 因此,我想知道是否有一种方法可以在从数据库中提取前缀0时将其删除(类似于某种TRIM0()),从而使两列中的元素相同 我试图避免在JAVA中处理此列以提高性能。您可以使用LTRIM从varchar编号中删除前导零:
我试图避免在JAVA中处理此列以提高性能。您可以使用LTRIM从varchar编号中删除前导零:
select ltrim( '0001234', '0' ) from dual;
但我建议重新审视您的设计,并将数字与数字进行比较。您可以尝试强制转换,但我相信这会影响查询的性能。如果一封信中有一封信,可能会引起问题
where cast(column1 as unsigned) = cast(column2 as unsigned)
(像某种TRIM0())这样两列中的元素都是相同的
您的要求是数据类型转换,而不是字符串操作。
元素可能看起来相似,但重要的是数据类型<代码>'123'和123
不一样。它们看起来很相似,但数据类型不同
不要使用LTRIM,因为它会返回一个字符串,您必须再次将其转换为数字,以避免隐式数据类型转换。返回字符串,然后再次使用to_NUMBER将其转换为NUMBER是没有意义的
正确而有效的方法是使用到_NUMBER。它只需一步就能把它转换成数字
比如说,
SQL> SELECT to_number('00123') num FROM dual;
NUM
----------
123
SQL> SELECT * FROM dual WHERE to_number('00123') = 123;
D
-
X
另一方面,如果您确定要处理的列始终需要一个数字,则必须在设计级别将其修复。将数字存储为字符类型是一个设计缺陷,除非有特定的业务需要。如果比较两个整数,您的问题将得到解决。我建议您将VARCHAR传输到intI,也就是说,在这两个位置使用相同的数字数据类型!LTRIM(列,'0')@jarlh在这里使用
LTRIM
没有意义。字符串上的LTRIM将返回一个字符串。只需使用到_NUMBER
。将其转换为数字的较短版本是使用到_NUMBER
。虽然您的做法是正确的,但主要要求是处理数据类型转换而不是字符串操作。要求是关于数据类型转换,而不是字符串操作。所以,你的答案并不完全符合要求<字符串的code>LTRIM将返回一个字符串。所以,您最终会将字符串与数字进行比较。依赖隐式数据类型转换是一种性能开销。您可以使用到\u NUMBER
一步完成。