2017-01-11 85 views
-1

我正在使用SQLPLUS,并且确实需要能够使用IF/THEN/ELSE,但我一直无法找到任何有关如何使其工作的信息。 (消息来源都说它不能完成),所以我试图用CASE来做同样的事情。我需要查看sysdate,如果它位于日期A和日期B之间,则运行Select语句。如果它没有转到下一个CASE声明。这里是我想要做的事情的一个窍门:sqlplus select case case

CASE 
    WHEN sysdate BETWEEN TO_DATE('28/08/2016', 'DD/MM/YYYY') AND TO_DATE('20/11/2016', 'DD/MM/YYYY') 
     THEN 
     (SELECT 
      schools.abbreviation, 
      students.entrydate, 
      students.lastfirst as Student, 
      students.student_number, 
      students.grade_level, 
      courses.course_name, 
      teachers.lastfirst as Teacher, 
      pgfinalgrades.grade, 
      round(pgfinalgrades.percent) as Percent, 
      (CASE 
       WHEN ps_customfields.getcf('Students', students.ID, 'zz_B_Soccer') = '1' 
       THEN 'Boys_Soccer' 
      ELSE NULL 
      END) AS "Athletic Sport - Fall" 
FROM pgfinalgrades 
    JOIN sections on pgfinalgrades.sectionid = sections.id 
    JOIN courses on upper(sections.course_number) = upper(courses.course_number) 
    JOIN cc on pgfinalgrades.studentid = cc.studentid and sections.id = cc.sectionid and sysdate between cc.dateenrolled and cc.dateleft 
    JOIN students on pgfinalgrades.studentid = students.id 
    JOIN prefs on prefs.name = 'curfgname-S' || sections.schoolid and pgfinalgrades.finalgradename = to_char(substr(prefs.value, 1,2)) 
    JOIN terms on terms.schoolid = sections.schoolid and sysdate between terms.firstday and terms.lastday and terms.isyearrec = 1 
    JOIN schools on sections.schoolid = schools.school_number 
    JOIN teachers on sections.teacher = teachers.id 
WHERE students.enroll_status = 0 
    AND sysdate between cc.dateenrolled and cc.dateleft 
    AND (pgfinalgrades.grade = 'C-' 
    OR pgfinalgrades.grade = 'D' 
    OR pgfinalgrades.grade = 'D-' 
    OR pgfinalgrades.grade = 'E' 
    OR pgfinalgrades.grade = 'F' 
    ) 
    AND --Fall Sports 
    (  ps_customfields.getcf('Students', students.ID, 'zz_B_Soccer') IS NOT NULL 
     OR ps_customfields.getcf('Students', students.ID, 'zz_B_Cross_Country') IS NOT NULL 
     OR ps_customfields.getcf('Students', students.ID, 'zz_Golf') IS NOT NULL 
    )); 

接下来将是冬季运动,然后是春季运动。 我在sysdate行收到错误“unknown command”,然后运行每个case。我不知道如何让它抓住今天的日期,确定它属于哪种情况,然后运行那一个让我输出。我打算在整个学年期间将其自动化为每周运行一次,并且不希望每年都要触碰它一次以上。 如果任何人都可以想到更好的方式来做到这一点,我是全部耳朵。 :)

+1

这并不是说我清楚你需要做什么。尝试构建一个简单的示例(一个包含一些有意义的数据的示例表)来解释您需要执行的操作。您可能还想看看[mcve] – Aleksej

+1

不,“CASE”不是流控制构造,主要是因为SQL是查询语言而不是编程语言。您当然可以使用PL/SQL,但是,我不会在PL/SQL中编写整个应用程序。说,我怀疑你可以用标准的SQL来获得你的结果,但是我们当然对你的问题一无所知。 –

+0

另请注意,您无法为每个CASE语句选择不同数量的列。相反,您需要使用返回标量(或对象类型)的子查询选择,例如:当dummy ='X'时选择case(从all_users中选择count(*))else(从double中选择count(*))end来自双重的cnt;或者选择dummy ='X'的情况,然后(从rownum = 1的all_users中选择myType(user_id,created))else(从dual中选择myType(111,sysdate))从dual结束; – gregory

回答

0

我用sqlplus工作,真正需要的是能够使用 IF/THEN/ELSE,但我一直没能找到我如何 可以得到工作的任何信息。 (Sources all say it can't be done

我会说这可以在PLSQL匿名块中做得很好,我们可以使用IF/ELSE声明。 请看到breif演示:

begin 
    if sysdate between to_date ('28/08/2016', 'DD/MM/YYYY') 
        and to_date ('20/11/2016', 'DD/MM/YYYY') 
    then 
     dbms_output.put_line ('Sysdate is beteeween the date range'); 
    ---You can run your sql query here 
    else 
     dbms_output.put_line ('Not in date range'); 
    ---You can run your sql query here 

    end if; 
end; 

输出

Not in date range 

PL/SQL procedure successfully completed.