Plsql PL/SQL Case语句-为NULL

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

我有一些SQL,太多了,无法添加这个问题中的所有语句,我正试图改进这些SQL,以避免系统减速

在PL/SQL的一部分中,有一个和Exists子句,它包含一个和notexists子句

这两个子句都包含Case语句。在case语句的结束部分之后,存在不为空为空语句。使用PL/SQL已经有几年了,这是我第一次看到这种语法,我承认我不理解它。下面显示了整个和Exists子句,非常感谢您的帮助

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=)