MySQL CONCAT截断IF THEN块

时间:2017-08-01 23:50:01

标签: mysql sorting if-statement stored-procedures concat

我在这里有一个奇怪的 - 至少对我来说很奇怪。

我正在处理一个相当简单的存储过程。可以基于Web表单将许多参数传递到过程中。其中之一是排序顺序参数。记录可以按song_title,artist或date_uploaded进行排序,但我总是希望返回的记录首先按song_title排序。如果用户选择song_title或艺术家进行排序,这可以正常工作,但如果用户选择' date_uploaded'它似乎会爆炸。我使用简单的IF ... THEN块来评估排序顺序并相应地修改它。

以下是代码:

DROP PROCEDURE IF EXISTS spGetAllTracksSong;
DELIMITER //

CREATE PROCEDURE spGetAllTracksSong(IN startRecord INT, IN rowsReturned       INT, IN searchArtist VARCHAR(255), IN searchTitle VARCHAR(244), IN orderBy VARCHAR(20), IN duets TINYINT(1))
BEGIN
    select concat('song_title,',orderBy);

    IF orderBy='date_uploaded' THEN SET orderBy='date_uploaded DESC';END IF;
    select orderBy;
    IF orderBy <> 'song_title' 
        THEN SET orderBy=CONCAT('song_title,',orderBy);
    END IF;
    select orderBy;

    SET @outputSQL=CONCAT('SELECT song_title, artist, disc_number, is_duet, comments
FROM track
WHERE song_title LIKE CONCAT(\'%',searchTitle,'%\')
AND artist LIKE CONCAT(\'%',searchArtist,'%\')
AND is_bad=0
AND is_duet=',duets,' 
ORDER BY ',orderBy ,' 
LIMIT ',startRecord,',', rowsReturned);


    PREPARE stmt FROM @outputSQL;
    EXECUTE stmt;   

END//
DELIMITER ;

所以,正在发生的事情是在我尝试连接的区块中,歌曲是&#39; song_title&#39;以及orderBy参数中的任何内容,它都会截断该参数的值。所以     date_uploaded DESC 变     date_uplo

对此有何想法?我确信这个问题在IF THEN块中,因为我已经测试了连接代码并且它产生了我想要的结果,但是如果我可以的话,我会感到很惊讶看看语法有什么问题。

1 个答案:

答案 0 :(得分:0)

正如评论所指出的那样,问题是orderBy变量的长度。这就是原因。它被声明为最多20个字符。如果其值不是song_title,则orderBy会为其添加song_title,。该字符串是11个字符。然后,date_uploaded DESC被截断为前9个字符,这使得order by子句设置为song_title,date_uplo

使orderBy变量至少再增加10个字符,问题就会消失。