[英]mysql - #1064 syntax error when creating a procedure using case for rand()
I am getting #1064 error. 我收到#1064错误。 I want to use rand() together case or if else statement. 我想在一起使用rand()case或if else语句。 I tried every solution but I achieved no result. 我尝试了所有解决方案,但没有取得任何结果 This is my sql query: 这是我的SQL查询:
DELIMITER ;;
CREATE PROCEDURE `pgetVideos`(pName varchar(100), positionID int)
BEGIN
SELECT
ID,
userID,
createddate_,
duedate_,
title,
description,
videourl,
categoryID,
positionID,
imagePath
FROM
videos
WHERE
videos.isDeleted<>1 AND
(positionID=0 OR videos.positionID = positionID)
ORDER BY
CASE pName
WHEN 'video1' THEN RAND() LIMIT 10
WHEN 'video2' THEN RAND() LIMIT 4
WHEN 'video3' THEN RAND() LIMIT 6
WHEN 'video4' THEN RAND()
END CASE;
END ;;
DELIMITER ;
Also I tried this code: 我也试过这段代码:
DELIMITER ;;
CREATE PROCEDURE `pgetVideos`(pName varchar(100), positionID int)
BEGIN
SELECT
ID,
userID,
createddate_,
duedate_,
title,
description,
videourl,
categoryID,
positionID,
imagePath
FROM
videos
WHERE
videos.isDeleted<>1 AND
(positionID=0 OR videos.positionID = positionID)
ORDER BY
IF pName = "video1" THEN
RAND() LIMIT 10
ELSE IF pName = "video2" THEN
RAND() LIMIT 4
ELSE IF pName = "video3" THEN
RAND() LIMIT 6
ELSE IF pName = "video4" THEN
RAND()
END IF;
END ;;
DELIMITER ;
How can I fix the error? 我该如何修复错误?
A CASE
expression just returns a value, and LIMIT
is not part of a value. CASE
表达式只返回一个值, LIMIT
不是值的一部分。 You're not substituting into the text of the query, you're returning a value that should be used when ordering the results. 您没有替换查询文本,而是返回在排序结果时应该使用的值。
It's not possible to use a computed expression in the LIMIT
clause. 在LIMIT
子句中不可能使用计算表达式。 But since you're doing this in a stored procedure, you can generate dynamic SQL using PREPARE
. 但是,由于您在存储过程中执行此操作,因此可以使用PREPARE
生成动态SQL。
DELIMITER ;;
CREATE PROCEDURE `pgetVideos`(pName varchar(100), positionID int)
BEGIN
SET @limit = CASE pname
WHEN 'video1' THEN 'LIMIT 10'
WHEN 'video2' THEN 'LIMIT 4'
WHEN 'video3' THEN 'LIMIT 6'
WHEN 'video4' THEN ''
END;
SET @sql = CONCAT('
SELECT
ID,
userID,
createddate_,
duedate_,
title,
description,
videourl,
categoryID,
positionID,
imagePath
FROM
videos
WHERE
videos.isDeleted<>1 AND
(positionID=0 OR videos.positionID = positionID)
ORDER BY RAND() ', @LIMIT);
PREPARE stmt FROM @sql;
EXECUTE stmt;
END ;;
DELIMITER ;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.