小编典典

如何基于字段的子字符串值联接两个表?

sql

我在使用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 ))

但这导致结果集空白。

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


阅读 200

收藏
2021-03-23

共1个答案

小编典典

有很多方法可以做到这一点。在致力于特定方法之前,以各种方式查看解释计划是一个好主意。例如,如果存在一个基于函数的索引,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);

另一个问题是,如果在这些值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+$'));

但是,您可能要考虑的另一件事-列u中的EMPLOYEE
id开头是否有原因?还会有其他主角吗?领导者u代表某种东西吗(违反了第一范式,但那确实发生了)?

2021-03-23