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

时间:2015-02-20 18:45:15

标签: sql oracle join inner-join

我遇到了sql的问题。我想加入两个表,员工和班级讲师。条件是员工正在拥有像#u; u0871457' u0871457'班主任将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 ))

但这导致结果为空白。

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

4 个答案:

答案 0 :(得分: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);

另一个问题是,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代表什么(违反了第一个正常形式,但是会发生这种情况)?

答案 1 :(得分:3)

Oracle使用1作为其索引的基础,因此substr('aaa',1,3)等同于'aaa'。您需要使用2作为substr的第二个参数才能完成您正在尝试的内容。


除此之外,如果可以的话,你可能只会更换一方更好。如果前缀字符是一致的,您可以这样做:

SELECT e.name, i.name
FROM   employee e INNER JOIN instructor i ON REPLACE (e.id, 'u', '0') = i.id

这可能允许数据库使用instructor上的索引,这对于您的解决方案是不可能的。

答案 2 :(得分:3)

角色位置错误。您应该在位置2上开始子字符串(字符串的第一个字符是1而不是0)。 另一方面,您在两个字符串上使用SUBSTR函数,而您应该仅使用员工ID。要小心,如果两个ID都是字符串,则长度会有所不同。

如果您只是想改变“你好”的话。在员工ID上,尝试使用TRANSLATE函数。

  

TRANSLATE返回char,其中from_string中每个字符的所有出现都被其在to_string中的相应字符替换。 char中不在from_string中的字符不会被替换。 from_string参数可以包含比to_string更多的字符。在这种情况下,from_string末尾的额外字符在to_string中没有对应的字符。如果这些额外字符出现在char中,则会从返回值中删除它们。

语法

  

──TRANSLATE──(' char',' from_string',' to_string')──><

Pl/SQL Example
TRANSLATE ('abcd', 'ab', '12') ==> '12cd'
TRANSLATE ('12345', '15', 'xx') ==> 'x234x'

答案 3 :(得分: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)

您的数据库使用基于1的索引。