Plsql PL/SQL Case语句-为NULL
我有一些SQL,太多了,无法添加这个问题中的所有语句,我正试图改进这些SQL,以避免系统减速 在PL/SQL的一部分中,有一个和Exists子句,它包含一个和notexists子句 这两个子句都包含Case语句。在case语句的结束部分之后,存在不为空或为空语句。使用PL/SQL已经有几年了,这是我第一次看到这种语法,我承认我不理解它。下面显示了整个和Exists子句,非常感谢您的帮助Plsql PL/SQL Case语句-为NULL,plsql,case,Plsql,Case,我有一些SQL,太多了,无法添加这个问题中的所有语句,我正试图改进这些SQL,以避免系统减速 在PL/SQL的一部分中,有一个和Exists子句,它包含一个和notexists子句 这两个子句都包含Case语句。在case语句的结束部分之后,存在不为空或为空语句。使用PL/SQL已经有几年了,这是我第一次看到这种语法,我承认我不理解它。下面显示了整个和Exists子句,非常感谢您的帮助 AND EXISTS ( SELECT Distinct PROJECTID From Milest
AND EXISTS (
SELECT Distinct PROJECTID
From Milestone_History MH,
Project_Milestone PM
Where MH.MilestoneId = PM.ID
AND MH.Projectid = PR.ID
AND ((UPPER(PM.Description) = 'FINAL BUILD INVOICE INSTRUCTIONS ISSUED') OR
(UPPER(PM.Description) = 'FEASIBILITY STUDY REQUIRED') OR
(UPPER(PM.Description) = 'PROJECT COMPLETE'))
AND (case when UPPER(PM.Description) = 'FEASIBILITY STUDY REQUIRED' then
Actual
End IS NOT NULL
AND
case
when UPPER(PM.Description) = 'PROJECT COMPLETE' then
MH.Actual
end IS NULL)
AND NOT EXISTS
(SELECT Distinct MH2.ProjectID
From Milestone_History MH2, Project_Milestone PM2
Where MH2.MilestoneId = PM2.ID
And MH2.ProjectID = MH.ProjectID
AND case
when UPPER(PM2.Description) = 'PROJECT COMPLETE' then -
MH2.Actual
end IS NOT NULL))
将
案例…END
视为一个表达式。您可以使用括号更好地理解:
(case when UPPER(PM.Description) = 'FEASIBILITY STUDY REQUIRED'
then Actual
End) IS NOT NULL
当且仅当大小写
找到匹配且实际
不为空时,此特定表达式才为不为空
这可以改写为:
(UPPER(pm.description) = 'FEASIBILITY STUDY REQUIRED'
AND actual IS NOT NULL)
(UPPER(PM.Description) != 'PROJECT COMPLETE'
OR PM.Description IS NULL
OR actual IS NULL)
AND UPPER(PM.Description) = 'FEASIBILITY STUDY REQUIRED'
AND Actual IS NOT NULL
AND (UPPER(PM.Description) <> 'PROJECT COMPLETE' OR MH.Actual IS NULL)
AND UPPER(PM2.Description) = 'PROJECT COMPLETE'
AND MH2.Actual IS NOT NULL
AND EXISTS
(SELECT Distinct PROJECTID
From Milestone_History MH, Project_Milestone PM
Where MH.MilestoneId = PM.ID
AND MH.Projectid = PR.ID
AND UPPER(PM.Description) = 'FEASIBILITY STUDY REQUIRED'
AND Actual IS NOT NULL
AND NOT EXISTS
(SELECT Distinct MH2.ProjectID
From Milestone_History MH2, Project_Milestone PM2
Where MH2.MilestoneId = PM2.ID
AND UPPER(PM2.Description) = 'PROJECT COMPLETE'
AND MH2.Actual IS NOT NULL
)
)
以下语句可以改写为:
(UPPER(pm.description) = 'FEASIBILITY STUDY REQUIRED'
AND actual IS NOT NULL)
(UPPER(PM.Description) != 'PROJECT COMPLETE'
OR PM.Description IS NULL
OR actual IS NULL)
AND UPPER(PM.Description) = 'FEASIBILITY STUDY REQUIRED'
AND Actual IS NOT NULL
AND (UPPER(PM.Description) <> 'PROJECT COMPLETE' OR MH.Actual IS NULL)
AND UPPER(PM2.Description) = 'PROJECT COMPLETE'
AND MH2.Actual IS NOT NULL
AND EXISTS
(SELECT Distinct PROJECTID
From Milestone_History MH, Project_Milestone PM
Where MH.MilestoneId = PM.ID
AND MH.Projectid = PR.ID
AND UPPER(PM.Description) = 'FEASIBILITY STUDY REQUIRED'
AND Actual IS NOT NULL
AND NOT EXISTS
(SELECT Distinct MH2.ProjectID
From Milestone_History MH2, Project_Milestone PM2
Where MH2.MilestoneId = PM2.ID
AND UPPER(PM2.Description) = 'PROJECT COMPLETE'
AND MH2.Actual IS NOT NULL
)
)
这两条语句明显重叠:description
只能有一个值。当我们合并它们时,剩下的就不多了:
(SELECT Distinct PROJECTID
From Milestone_History MH,
Project_Milestone PM
Where MH.MilestoneId = PM.ID
AND MH.Projectid = PR.ID
AND UPPER(PM.Description) = 'FEASIBILITY STUDY REQUIRED'
AND actual IS NOT NULL
AND NOT EXISTS
(SELECT Distinct MH2.ProjectID
From Milestone_History MH2, Project_Milestone PM2
Where MH2.MilestoneId = PM2.ID
And MH2.ProjectID = MH.ProjectID
AND PM2.Description = 'PROJECT COMPLETE'
AND MH2.Actual IS NOT NULL)
)
我认为在只有一个案例的情况下使用CASE
有点误导
要么作者被错误地告知了案例的行为,要么这是未经清理而一直更新的残余代码。前两种情况:
Where MH.MilestoneId = PM.ID
AND MH.Projectid = PR.ID
AND (UPPER(PM.Description) = 'FINAL BUILD INVOICE INSTRUCTIONS ISSUED' OR
UPPER(PM.Description) = 'FEASIBILITY STUDY REQUIRED' OR
UPPER(PM.Description) = 'PROJECT COMPLETE')
-联接子查询中的两个表,并将子查询联接到主查询
接下来的三个条件:
Where MH.MilestoneId = PM.ID
AND MH.Projectid = PR.ID
AND (UPPER(PM.Description) = 'FINAL BUILD INVOICE INSTRUCTIONS ISSUED' OR
UPPER(PM.Description) = 'FEASIBILITY STUDY REQUIRED' OR
UPPER(PM.Description) = 'PROJECT COMPLETE')
-确保Description
是三个值之一
但是,下一个条件是:
AND case when UPPER(PM.Description) = 'FEASIBILITY STUDY REQUIRED'
then Actual End IS NOT NULL
AND case when UPPER(PM.Description) = 'PROJECT COMPLETE'
then MH.Actual end IS NULL
-虽然本身是OK,但与前面三个条件中的两个条件相矛盾。当条件THEN value END为NOTNULL时,写为CASE的表达式本质上是说这两个条件必须为真(否则CASE子句的计算结果为NULL)和该值不得为空;它可以改写为:
(UPPER(pm.description) = 'FEASIBILITY STUDY REQUIRED'
AND actual IS NOT NULL)
(UPPER(PM.Description) != 'PROJECT COMPLETE'
OR PM.Description IS NULL
OR actual IS NULL)
AND UPPER(PM.Description) = 'FEASIBILITY STUDY REQUIRED'
AND Actual IS NOT NULL
AND (UPPER(PM.Description) <> 'PROJECT COMPLETE' OR MH.Actual IS NULL)
AND UPPER(PM2.Description) = 'PROJECT COMPLETE'
AND MH2.Actual IS NOT NULL
AND EXISTS
(SELECT Distinct PROJECTID
From Milestone_History MH, Project_Milestone PM
Where MH.MilestoneId = PM.ID
AND MH.Projectid = PR.ID
AND UPPER(PM.Description) = 'FEASIBILITY STUDY REQUIRED'
AND Actual IS NOT NULL
AND NOT EXISTS
(SELECT Distinct MH2.ProjectID
From Milestone_History MH2, Project_Milestone PM2
Where MH2.MilestoneId = PM2.ID
AND UPPER(PM2.Description) = 'PROJECT COMPLETE'
AND MH2.Actual IS NOT NULL
)
)
-这更清楚、更简洁(并排除了前面括号中三个条件中的两个)
下一个条件:
AND case when UPPER(PM.Description) = 'FEASIBILITY STUDY REQUIRED'
then Actual End IS NOT NULL
AND case when UPPER(PM.Description) = 'PROJECT COMPLETE'
then MH.Actual end IS NULL
-尽管(再次)本身正常,但由于之前的条件,基本上是多余的;它可以改写为:
(UPPER(pm.description) = 'FEASIBILITY STUDY REQUIRED'
AND actual IS NOT NULL)
(UPPER(PM.Description) != 'PROJECT COMPLETE'
OR PM.Description IS NULL
OR actual IS NULL)
AND UPPER(PM.Description) = 'FEASIBILITY STUDY REQUIRED'
AND Actual IS NOT NULL
AND (UPPER(PM.Description) <> 'PROJECT COMPLETE' OR MH.Actual IS NULL)
AND UPPER(PM2.Description) = 'PROJECT COMPLETE'
AND MH2.Actual IS NOT NULL
AND EXISTS
(SELECT Distinct PROJECTID
From Milestone_History MH, Project_Milestone PM
Where MH.MilestoneId = PM.ID
AND MH.Projectid = PR.ID
AND UPPER(PM.Description) = 'FEASIBILITY STUDY REQUIRED'
AND Actual IS NOT NULL
AND NOT EXISTS
(SELECT Distinct MH2.ProjectID
From Milestone_History MH2, Project_Milestone PM2
Where MH2.MilestoneId = PM2.ID
AND UPPER(PM2.Description) = 'PROJECT COMPLETE'
AND MH2.Actual IS NOT NULL
)
)
-可以改写为:
(UPPER(pm.description) = 'FEASIBILITY STUDY REQUIRED'
AND actual IS NOT NULL)
(UPPER(PM.Description) != 'PROJECT COMPLETE'
OR PM.Description IS NULL
OR actual IS NULL)
AND UPPER(PM.Description) = 'FEASIBILITY STUDY REQUIRED'
AND Actual IS NOT NULL
AND (UPPER(PM.Description) <> 'PROJECT COMPLETE' OR MH.Actual IS NULL)
AND UPPER(PM2.Description) = 'PROJECT COMPLETE'
AND MH2.Actual IS NOT NULL
AND EXISTS
(SELECT Distinct PROJECTID
From Milestone_History MH, Project_Milestone PM
Where MH.MilestoneId = PM.ID
AND MH.Projectid = PR.ID
AND UPPER(PM.Description) = 'FEASIBILITY STUDY REQUIRED'
AND Actual IS NOT NULL
AND NOT EXISTS
(SELECT Distinct MH2.ProjectID
From Milestone_History MH2, Project_Milestone PM2
Where MH2.MilestoneId = PM2.ID
AND UPPER(PM2.Description) = 'PROJECT COMPLETE'
AND MH2.Actual IS NOT NULL
)
)
因此,整个条款可以改写为:
(UPPER(pm.description) = 'FEASIBILITY STUDY REQUIRED'
AND actual IS NOT NULL)
(UPPER(PM.Description) != 'PROJECT COMPLETE'
OR PM.Description IS NULL
OR actual IS NULL)
AND UPPER(PM.Description) = 'FEASIBILITY STUDY REQUIRED'
AND Actual IS NOT NULL
AND (UPPER(PM.Description) <> 'PROJECT COMPLETE' OR MH.Actual IS NULL)
AND UPPER(PM2.Description) = 'PROJECT COMPLETE'
AND MH2.Actual IS NOT NULL
AND EXISTS
(SELECT Distinct PROJECTID
From Milestone_History MH, Project_Milestone PM
Where MH.MilestoneId = PM.ID
AND MH.Projectid = PR.ID
AND UPPER(PM.Description) = 'FEASIBILITY STUDY REQUIRED'
AND Actual IS NOT NULL
AND NOT EXISTS
(SELECT Distinct MH2.ProjectID
From Milestone_History MH2, Project_Milestone PM2
Where MH2.MilestoneId = PM2.ID
AND UPPER(PM2.Description) = 'PROJECT COMPLETE'
AND MH2.Actual IS NOT NULL
)
)
+1 GMTA:)我不确定是删除我的,还是把它作为一种稍微不同的表达方式。@MarkBannister=)