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

How to join two tables based on substring values of fields?

我在使用 sql 时遇到问题。我想加入两个表,员工和 class 讲师。条件是员工有像 'u0871457' 这样的 unid 列,其中 class 讲师的 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 ))

但这会导致生成空白结果集。

如有任何帮助,我们将不胜感激。谢谢你的时间!

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 上的索引,这对于您的解决方案是不可能的。

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 开始的索引。

字符位置错误。你应该从位置 2 开始你的子字符串(你的字符串的第一个字符是 1 而不是 0)。 另一方面,您在两个字符串上都使用了 SUBSTR 函数,而您应该只在员工 ID 上使用。注意,如果两个id都是字符串,长度会不一样。

如果您只想更改员工 ID 上的 'u',请尝试使用 TRANSLATE 函数。

TRANSLATE returns char with all occurrences of each character in from_string replaced by its corresponding character in to_string. Characters in char that are not in from_string are not replaced. The argument from_string can contain more characters than to_string. In this case, the extra characters at the end of from_string have no corresponding characters in to_string. If these extra characters appear in char, they are removed from the return value.

语法

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

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

有很多方法可以做到这一点。在提交特定方法之前,以各种方式查看解释计划是个好主意。例如,如果 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+$'));

但是,您可能还需要考虑另一件事——EMPLOYEE id 列中的前导 u 是否有原因?还能有其他主角吗?前导 u 是否代表某些东西(违反第一范式,但这种情况发生了)?