如何解决根据 case when 子句
我是 MysqL 的初学者,我试图根据 case when 子句中的条件执行不同的准备好的语句。问题是找到表 STATION 的 LAT_N 列的中位数,我想在 LAT_N 记录的偶数和奇数时使用 Case。
这是我为奇数情况准备的声明:
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,1) + (SELECT ROUND(LAT_N,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) 所以我想知道是否有任何替代方法。 非常感谢
解决方法
我已经找到了答案,其中包括过程的使用
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,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,1';
EXECUTE STMT1 USING @foo;
END IF;
END$$
DELIMITER ;
CALL latmed()
我认为它有点长,所以如果有人有更短的代码可以回答我的问题。谢谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。