oracle-sqldeveloper - 根据表 1 中字符串内容的条件连接两个表
问题描述
我有两个表,我通过将 Table_A 的“some_name”与 Table_B 的“j_name”匹配来加入它们。在少数情况下,我想根据以下标准加入:
- 例如,如果在 Table_A 中找到字符串“AB-FBb3”,那么我想将它与 Table_B 中的特定值“QT001”进行匹配。
这可能吗?
Table_A:
**AB some_name G_NAME Status some_time**
------------------------------------------------------------
AAA Job1 xxxxxxxxx Ended OK 2020-06-29 10:37:52
AAA AB-Jobd xxxxxxxxx Ended OK 2020-06-29 10:37:52
BBB AB-ADu001 xxxxxxxxx Ended OK 2020-06-29 10:37:52
BBB AB-Job2 xxxxxxxxx Ended OK 2020-06-29 10:37:52
BBB AB-FBb3 xxxxxxxxx Ended OK 2020-06-29 10:37:52
Table_B:
**RM j_name desc rand_time**
----------------------------------------------------
111 AB-Job2 Sometext 2020-06-29 06:30:51
111 AB-Job5 Sometext1 2020-06-29 09:31:52
222 LLu001 Sometext2 2020-06-29 09:34:11
222 QT001 Sometext4 2020-06-29 11:32:23
222 BMX-Jobd Sometext4 2020-06-29 11:32:23
到目前为止,我还想附加上述条件:
SELECT a.some_name,a.some_time, b.desc
FROM Table_A a
LEFT JOIN Table_B b
ON
(b.j_name IN (a.service_name, 'LL' || SUBSTR(a.some_name, instr(a.some_name, 'AD')+2 ,4)))
or
(b.j_name IN (a.service_name, 'BMX-' || a.some_name))
where a.some_name like 'AB-%' order by log_time desc
解决方案
这似乎是一个相当不愉快的问题。
从您的示例中我看不出重命名有什么逻辑;它似乎只是一个硬编码的替换列表。
我会选择类似的东西:
SELECT *
FROM (
SELECT some_name,
CASE some_name
WHEN 'AB-FBb3' THEN 'QT001'
-- etc.
ELSE some_name
END AS j_name
FROM Table_A
) AS a
FULL OUTER JOIN Table_B b ON a.j_name = b.j_name
因为CASE
子查询中的 可以很容易地看到重命名。
推荐阅读
- flutter - 如何在 Flutter 中缩放对话框
- discord.js - 每当发送 dm 时,discordjs 都会记录问题
- linux - 为什么`sh -c "export a=1&&echo $a"`什么都不返回?
- java - Java Drum Sequencer:如何从复选框状态集成实时排序?
- c++ - 运行时检查失败 #2 - 变量“e”周围的堆栈已损坏。发生了
- python - Django ImportError:无法从部分初始化的模块“accounts.models”导入名称“ReporterProfile”(很可能是由于循环导入)
- javascript - 使用 useState react hook 后返回的状态变量显示 .map 不是函数
- node.js - 从集合返回的重复项目
- c++ - 如何在 vscode 中使用 C++20?
- c# - WPF中的旋转图像不考虑屏幕尺寸