如何替换同一列中多个名称并关联其他数据库表?
如何通过字段转换关联两张表Table T与Table S
需求说明
你需要关联Table T和Table S,其中Table T的var字段要经过以下转换后匹配Table S的var1字段:
- 先将
var转为全大写 - 把
_transform_替换为_TRANS_ - 把
_difference_替换为_DIF_ - 把
_upper_替换为_UPP_
示例数据与期望结果
Table T原始数据
| id | var |
|---|---|
| 1 | col_difference_tr |
| 2 | pro_transform_rd |
| 3 | cap_upper_ld |
Table S原始数据
| process | var1 |
|---|---|
| 32 | COL_DIF_TR |
| 45 | PRO_TRANS_RD |
| 32 | CAP_UPP_LD |
期望关联结果
| id | process | var1 |
|---|---|---|
| 1 | 32 | COL_DIF_TR |
| 2 | 45 | PRO_TRANS_RD |
| 3 | 32 | CAP_UPP_LD |
你之前SQL的问题
你写的SQL存在两个致命问题:
- 重复别名错误:多次
LEFT JOIN TABLA_S IV使用了同一个别名IV,数据库无法识别重复的别名,直接会报语法错误。 - 逻辑错误:你试图用单个替换条件分别关联,但实际上需要对
var字段完成所有转换步骤后再去匹配var1,而不是分多次关联同一张表。
正确的SQL实现
这里提供两种实现方式,你可以根据自己的需求选择:
方式1:嵌套REPLACE函数(简洁直接)
直接在JOIN条件里完成所有转换操作,一步到位:
SELECT T.id, S.process, S.var1 FROM Table_T T JOIN Table_S S ON REPLACE(REPLACE(REPLACE(UPPER(T.var), '_transform_', '_TRANS_'), '_difference_', '_DIF_'), '_upper_', '_UPP_') = S.var1;
方式2:使用WITH子句(可读性更强)
如果后续转换逻辑可能修改,用WITH子句先预处理Table T的字段,再关联会更清晰:
WITH Transformed_T AS ( SELECT id, var, -- 按顺序完成所有转换 REPLACE(REPLACE(REPLACE(UPPER(var), '_transform_', '_TRANS_'), '_difference_', '_DIF_'), '_upper_', '_UPP_') AS transformed_var FROM Table_T ) SELECT TT.id, S.process, S.var1 FROM Transformed_T TT JOIN Table_S S ON TT.transformed_var = S.var1;
如果需要保留Table T中没有匹配到的记录,可以把JOIN换成LEFT JOIN。
内容的提问来源于stack exchange,提问作者Lectxx7
相关产品推荐
相关产品推荐

