sql - sql oracle - 使用 case when 过滤查询 sql
问题描述
我有以下查询
select
ens.ID_ENS,
ens.NOM_ENS,
-- for the first SURVEILLANT
disp.SALLE_EXAM,
disp.NB_HEURES_ENS,
-- for the second SURVEILLANT
disp.SALLE_EXAM2,
disp.NB_HEURES_ENS2
from ESP_ENSEIGNANT ens, ESP_MODULE_PANIER_CLASSE_SAISO disp
WHERE ens.ID_ENS IN (disp.SURVEILLANT, disp.SURVEILLANT2) AND ens.NOM_ENS != 'A AFFECTER';
我想只为 SURVEILLANT 更新显示 SALLE_EXAM、NB_HEURES_ENS 的查询
select
ens.ID_ENS,
ens.NOM_ENS,
CASE
WHEN ens.ID_ENS = disp.SURVEILLANT THEN (disp.SALLE_EXAM AS "EXAM", disp.NB_HEURES_ENS AS "HOURDISP")
WHEN ens.ID_ENS = disp.SURVEILLANT2 THEN (disp.SALLE_EXAM2 AS "EXAM", disp.NB_HEURES_ENS2 AS "HOURDISP")
END
from ESP_ENSEIGNANT ens, ESP_MODULE_PANIER_CLASSE_SAISO disp
WHERE ens.ID_ENS IN (disp.SURVEILLANT, disp.SURVEILLANT2) AND ens.NOM_ENS != 'A AFFECTER';
解决方案
JOIN
您可以使用显式语法将查询重写为
SELECT ens.ID_ENS,
ens.NOM_ENS,
CASE
WHEN ens.ID_ENS = disp.SURVEILLANT THEN
disp.SALLE_EXAM
WHEN ens.ID_ENS = disp.SURVEILLANT2 THEN
disp.SALLE_EXAM2
END AS "EXAM",
CASE
WHEN ens.ID_ENS = disp.SURVEILLANT THEN
disp.NB_HEURES_ENS
WHEN ens.ID_ENS = disp.SURVEILLANT2 THEN
disp.NB_HEURES_ENS2
END AS "HOURDISP"
FROM ESP_ENSEIGNANT ens
JOIN ESP_MODULE_PANIER_CLASSE_SAISO disp
ON ens.ID_ENS IN (disp.SURVEILLANT, disp.SURVEILLANT2)
AND ens.NOM_ENS != 'A AFFECTER';
附注:如果disp.SURVEILLANT
和disp.SURVEILLANT2
具有相等的值,则disp.SALLE_EXAM
和disp.NB_HEURES_ENS
将分别被选中。例如,第一个组件具有优先权。
推荐阅读
- django - 自定义限制问题
- c# - 在字符串 C# 中的特定字符之间查找和移动未知单词
- node.js - 如何将段落对齐添加到 Pug 模板?
- c# - 是否有在所有 Control_Prerender 事件之后触发的事件
- c++ - Boost 库需要我认为没有必要的 lib 文件
- .net - 运行测试时 .net sdk 和 .net core 之间不兼容
- arrays - 使用 Excel 循环 (VBA) 更新数组范围
- javascript - D3js v5 是否向后兼容 v4?
- php - 表格行无法正确使用 codeigniter 中的分页
- donejs - DoneJS - 动态加载器