MySQL CONCAT返回带有两个有效字符串的null

时间:2016-09-27 18:32:00

标签: mysql string-concatenation

我正在开发一个应该充当JSON_MERGE的MySQL函数(我的部署服务器是MySQL 5.5.51),并且我从CONCAT获得了一个空值返回MySQL功能。一段代码可以更好地解释:

    IF(v_json is not null AND v_fianlJson is not null) THEN
        return CONCAT(v_fianlJson, v_json);
    END IF;

我无法理解为什么此concat的结果为null。你能看到我失踪的东西吗?

我粘贴在全部功能之下。在我的本地环境(MySQL 5.5.42)中,此功能可以使用相同的数据。

USE `o2stag`;
DROP function IF EXISTS `getApplicationData`;

DELIMITER $$
USE `stag`$$

CREATE DEFINER=`root`@`localhost` FUNCTION `getApplicationData`(pApplication_id INT) RETURNS text CHARSET latin1
BEGIN
    DECLARE v_id INT DEFAULT NULL;
    DECLARE v_json TEXT DEFAULT NULL;
    DECLARE v_finalJson TEXT DEFAULT NULL;

    SELECT 
        id, data INTO v_id, v_json
    FROM application_data 
    WHERE application_id = pApplication_id ORDER BY id LIMIT 1; 

    WHILE (v_id is not null) DO

        IF(v_finalJson is null AND v_json is not null) THEN
            SET v_finalJson = v_json;       
        ELSE

            IF(v_finalJson is not null AND v_json is not null) THEN               
                SET v_finalJson = CONCAT(CONCAT(LEFT(v_finalJson, CHAR_LENGTH(v_finalJson) -1), ''),',', SUBSTRING(v_json, 2));             
            END IF;

        END IF;
        #---------------------------------------------------------------
        # Just to control the logic cursor
        IF(SELECT 1=1 FROM application_data WHERE application_id = pApplication_id AND id > v_id ORDER BY id LIMIT 1) THEN
            SELECT id, data INTO v_id, v_json FROM application_data 
            WHERE application_id = pApplication_id 
                AND id > v_id ORDER BY id LIMIT 1;      
        ELSE
            SET v_id = null;
            SET v_json = '';
       END IF;

    END WHILE;      

    RETURN v_finalJson;
END$$

DELIMITER ;

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

我们必须使用group_concat重新创建函数,它在数据库中保存了大量查询。对于group_concat,函数可以连接的字符数有限制,我不知道如何为concat函数设置此限制,但我相信必须有一种方法来设置它。

新功能:

USE `stag`;
DROP function IF EXISTS `getApplicationData`;

DELIMITER $$
USE `o2stag`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `getApplicationData`(pApplication_id INT) RETURNS text CHARSET latin1
BEGIN
    # creates a full json object
    DECLARE v_finalJson TEXT DEFAULT NULL;

    SET group_concat_max_len = 9999999999;

    SELECT GROUP_CONCAT('{',Json,'}') INTO v_finalJson FROM(
        SELECT 
            GROUP_CONCAT( SUBSTRING( data, 2, LENGTH( data ) - 2 ) SEPARATOR ',') AS Json
        FROM stag.application_data 
        WHERE application_id = pApplication_id) AS TJoin;

    RETURN v_finalJson;

END$$

DELIMITER ;

答案 1 :(得分:0)

使用CONCAT_WS为我解决了类似的问题。似乎对空值的处理方式与CONCAT不同。

CONCAT_WS('', v_fianlJson, v_json)