Sql 删除或添加Oracle中的前导0以匹配其他值

Sql 删除或添加Oracle中的前导0以匹配其他值,sql,oracle,leading-zero,Sql,Oracle,Leading Zero,我在这个网站上发现了许多与我的问题相关的类似问题,但我找不到确切问题的答案。我把表A和表B连接在一起,关于控制号。表A中有些控制编号为6位,有些控制编号为7位。表B只有7个 Table A Table B 0000714 0000714 285073 0285073 我试过做一个ltrim: select ltrim(control_number, '0000000') as control_number from Table B 但无

我在这个网站上发现了许多与我的问题相关的类似问题,但我找不到确切问题的答案。我把表A和表B连接在一起,关于控制号。表A中有些控制编号为6位,有些控制编号为7位。表B只有7个

   Table A      Table B
  0000714       0000714
  285073        0285073
我试过做一个ltrim:

   select ltrim(control_number, '0000000') as control_number from Table B
但无论控制编号中有多少位数字,这都会删除前导0。诸如012345之类的值变为12345

我只需要一个可以匹配两个表中的控件号的查询

   select a.*, b.*
   from Table A
   inner join Table B
   on a.control_number = b.control_number

如果您不关心性能,则可以将两者转换为数字:

on to_number(a.control_number) = to_number(b.control_number)
如果您确实关心性能,请修复数据,使值具有相同的格式。另外,声明表之间的外键关系,这些关系应该在表中声明。

您可以使用cast将其转换为整数,如下所示-

select a.*, b.*
   from Table A
   inner join Table B
   on cast(a.control_number as int) = cast(b.control_number as int)
如果在尝试将列强制转换为数字时收到ORA-01722:invalid number错误,则问题可能是该列中的值不是数字

使用下面这样的查询应该根据需要连接表。根据您的Oracle版本,您还可以使用VALIDATE_转换功能来帮助加入

WITH
    a (control_number)
    AS
        (SELECT '0000714' FROM DUAL
         UNION ALL
         SELECT '285073' FROM DUAL),
    b (control_number)
    AS
        (SELECT '0000714' FROM DUAL
         UNION ALL
         SELECT '0285073' FROM DUAL)
SELECT a.*, b.*
  FROM a
       INNER JOIN b
           ON (CASE
                   WHEN LENGTH (a.control_number) < 7 THEN LPAD (a.control_number, 7, '0')
                   ELSE a.control_number
               END =
               b.control_number);

使用零将表A中的值向左填充至7个字符

select a.*, b.*
from Table A
inner join Table B
on lpad(a.control_number,7,'0') = b.control_number;
如果控制编号不总是数字,则可避免可能的ORA-01722错误


如果性能需要,例如,如果表A非常大而表B非常小,请使用查询中的lpad表达式在表A上创建一个基于函数的索引。

既然您说您在强制转换中遇到问题,您可以尝试使用TRIM函数的扩展功能-

SELECT a.*, b.*
  FROM Table_A
 INNER JOIN Table_B ON TRIM(LEADING '0' FROM a.control_number) = TRIM(LEADING '0' FROM b.control_number)

当我尝试将数字转换为int时,我得到一个无效的数字错误。只是检查一下,数据类型是varchar2,对吗?如果是这样的话,列中的所有值都可以转换成数字吗?我看不到这些表,因为它们在另一个系统中。我刚刚得到了要加入的表和字段。我不知道这些数据类型是什么。你可以查询它,但不能描述它?看起来很奇怪。您能在其上创建一个视图并描述该视图吗?我正在使用SQL Server并通过OpenQuery连接到Oracle表。OpenQuery不允许我描述表。或者创建视图?还是使用dump?这似乎有效。我以前从未见过这样的代码。非常感谢。