簡體   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