如何根据字段的子字符串值连接两个表?

use*_*erx 4 sql oracle join inner-join

我有sql的问题.我想加入两个表,员工和班级讲师.条件是员工有像'u0871457'这样的unid列,其中班级讲师将EmplId设为'00871457'.

我只想将EmplId的第一个字符替换为'u'来加入以匹配来自unid的字符串.我怎样才能做到这一点?到目前为止我试过这个:

select e.name, i.name
from  Employee e
inner join Instructor i on SUBSTR(e.id,1, LENGTH(e.id )) = SUBSTR(i.id,1, LENGTH(i.id ))
Run Code Online (Sandbox Code Playgroud)

但这导致结果为空白.

任何帮助将不胜感激.谢谢你的时间!

Dav*_*ber 7

有很多方法可以做到这一点.在提交特定方法之前,以各种方式查看解释计划是个好主意.例如,如果有一个基于函数的索引EMPLOYEE,例如SUBSTR(id, 2, LENGTH(id) - 1),那么你将要使用在查询:

SELECT e.name, i.name
  FROM employee e INNER JOIN instructor i
    ON SUBSTR(e.id, 2, LENGTH(e.id) - 1) = SUBSTR(i.id, 2, LENGTH(i.id) - 1);
Run Code Online (Sandbox Code Playgroud)

另一个问题是,id列中的值是否总是在EMPLOYEE 和中的 长度相同INSTRUCTOR.如果它们长度不同会怎么样?也许有一个比另一个更多的填充.此外,他们将永远是距领先u?如果是这样,那么尝试安全TO_NUMBER()转换可能是值得的:

SELECT e.name, i.name
  FROM employee e INNER JOIN instructor i
    ON TO_NUMBER(REGEXP_SUBSTR(e.id, '\d+$')) = TO_NUMBER(REGEXP_SUBSTR(i.id, '\d+$'));
Run Code Online (Sandbox Code Playgroud)

然而,您可能想要考虑另一件事 - 是否有理由uEMPLOYEE id专栏中领先?可以有其他主角吗?领先者是否u代表某种东西(违反了第一种正常形式,但却发生了这种情况)?