繁体   English   中英

mysql - 使用rand()创建过程时出现#1064语法错误

[英]mysql - #1064 syntax error when creating a procedure using case for rand()

我收到#1064错误。 我想在一起使用rand()case或if else语句。 我尝试了所有解决方案,但没有取得任何结果 这是我的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 ;

我也试过这段代码:

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 ;

我该如何修复错误?

CASE表达式只返回一个值, LIMIT不是值的一部分。 您没有替换查询文本,而是返回在排序结果时应该使用的值。

LIMIT子句中不可能使用计算表达式。 但是,由于您在存储过程中执行此操作,因此可以使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM