我正在开发一个应该充当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 ;
感谢您的帮助
答案 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)