我正在使用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。我不知道如何讓它抓住今天的日期,確定它屬於哪種情況,然後運行那一個讓我輸出。我打算在整個學年期間將其自動化爲每週運行一次,並且不希望每年都要觸碰它一次以上。 如果任何人都可以想到更好的方式來做到這一點,我是全部耳朵。 :)
這並不是說我清楚你需要做什麼。嘗試構建一個簡單的示例(一個包含一些有意義的數據的示例表)來解釋您需要執行的操作。您可能還想看看[mcve] – Aleksej
不,「CASE」不是流控制構造,主要是因爲SQL是查詢語言而不是編程語言。您當然可以使用PL/SQL,但是,我不會在PL/SQL中編寫整個應用程序。說,我懷疑你可以用標準的SQL來獲得你的結果,但是我們當然對你的問題一無所知。 –
另請注意,您無法爲每個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