Выполнение другого подготовленного заявления на основе условий предложения case when

#mysql #prepared-statement #case-when

Вопрос:

Я довольно новичок в MySQL и пытаюсь выполнять различные подготовленные операторы на основе условий в предложении case when. Проблема заключается в том, чтобы найти медиану столбца LAT_N таблицы, и я хочу использовать случай, когда для четного и нечетного числа записей LAT_N.

Это мое подготовленное заявление для странного случая:

 SET @foo = (SELECT ROUND((COUNT(*)-1)/2) FROM STATION);
PREPARE STMT1 FROM 'SELECT ROUND(LAT_N,4) FROM STATION ORDER BY LAT_N LIMIT ?,1';
EXECUTE STMT1 USING @foo;
 

И это для четных:

 SET @foo1 = (SELECT ROUND(COUNT(*)/2) FROM STATION);
SET @foo2 = (SELECT ROUND((COUNT(*) 2)/2) FROM STATION);
PREPARE STMT2 FROM 'SELECT ROUND((((SELECT ROUND(LAT_N,4) FROM STATION ORDER BY LAT_N LIMIT ?,1)   (SELECT ROUND(LAT_N,4) FROM STATION ORDER BY LAT_N LIMIT ?,1))/2),4)';
EXECUTE STMT2 USING @foo1, @foo2;
 

И моя идея немного похожа на этот код:

 SELECT CASE WHEN COUNT(*)%2=0 THEN EXECUTE STMT2 USING @foo1, @foo2
            ELSE EXECUTE STMT1 USING @foo
FROM STATION
END;
 

Но этот код возвращает ошибку 1064 (42000), поэтому мне интересно, есть ли для этого какая-либо альтернатива.
Большое спасибо

Ответ №1:

Я нашел ответ на этот вопрос, который включает в себя использование процедуры

 DELIMITER $

CREATE PROCEDURE latmed()
BEGIN 
IF (SELECT COUNT(*) FROM STATION)%2=0 THEN
    SET @foo1 = (SELECT ROUND(COUNT(*)/2) FROM STATION);
    SET @foo2 = (SELECT ROUND((COUNT(*) 2)/2) FROM STATION);
    PREPARE STMT2 FROM 'SELECT ROUND((((SELECT ROUND(LAT_N,4) FROM STATION ORDER BY LAT_N LIMIT ?,1)   (SELECT ROUND(LAT_N,4) FROM STATION ORDER BY LAT_N LIMIT ?,1))/2),4)';
    EXECUTE STMT2 USING @foo1, @foo2;
ELSE
    SET @foo = (SELECT ROUND((COUNT(*)-1)/2) FROM STATION);
    PREPARE STMT1 FROM 'SELECT ROUND(LAT_N,4) FROM STATION ORDER BY LAT_N LIMIT ?,1';
    EXECUTE STMT1 USING @foo;
END IF;
END$

DELIMITER ;
CALL latmed()
 

Я думаю, что это немного длинновато, поэтому, если у кого-то есть более короткий код, он может ответить на мой вопрос. Спасибо