我遇到了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 ))
但这导致结果为空白。
任何帮助将不胜感激。谢谢你的时间!
答案 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的索引。