Mysql
SQL case語句不執行else部分
問題陳述:
創建一個函式以使用 roll_no 搜尋學生;如果存在,則顯示“學生姓名和課程”,否則顯示“不存在”。
CREATE FUNCTION search(roll_num VARCHAR(50)) RETURNS VARCHAR(150) RETURN (SELECT CASE WHEN `roll_no`= roll_num THEN CONCAT (`student`.`student_name`,`student`.`course_id`) ELSE 'Roll No not exist ' END FROM `student`WHERE `student`.`roll_no` = roll_num); SELECT search(31219005) ; //since this is an existing roll num everything went correct. SELECT search(21219005) ; //this roll is not an existing one in the DB, but it simply shows NULL , instead of existing my else part.
這會返回想要的結果,但我不認為你只需要課程 ID。
但這應該有助於進一步
DELIMITER $$ CREATE FUNCTION search(roll_num VARCHAR(50)) RETURNS VARCHAR(150) DETERMINISTIC BEGIN IF (EXISTS(SELECT 1 FROM `student` WHERE `student`.`roll_no` = roll_num)) THEN RETURN (SELECT CONCAT (`student`.`student_name`,`student`.`course_id`) FROM `student`WHERE `student`.`roll_no` = roll_num); ELSE RETURN 'Roll No not exist '; END IF; END$$ DELIMITER ;
您的解決方案的問題在於,當您沒有找到 roll_no 時,就沒有其他東西可以應用(沒有行)。確保有一行要返回的一種方法是從常量表中進行選擇,例如 DUAL 或 values 子句(但我認為 MySQL 中都不存在),例如:
select COALESCE(s.student_name, 'Roll No not exist') from dual left join students s on s.roll_num = ?
COALESCE 將選擇第一個(左起)不為空的列。如果一行存在,它將被選中,如果不是常量字元串。
另一種變體是使用聯合併添加排序屬性:
select t.student_name from ( select 0, student_name from student where roll_num = '1' union all select 1, 'Roll No not exist' order by 1 limit 1 ) as t;
由於我們正在選擇具有最低排序號的行,因此現有行將優先於常量行。
既然我相信函式本身沒有問題,我就把它留在那裡