Mysql

SQL case語句不執行else部分

  • April 26, 2020

問題陳述:

創建一個函式以使用 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;

由於我們正在選擇具有最低排序號的行,因此現有行將優先於常量行。

既然我相信函式本身沒有問題,我就把它留在那裡

引用自:https://dba.stackexchange.com/questions/265879