【问题标题】:MySQL CONCAT return null with two valid stringsMySQL CONCAT 返回具有两个有效字符串的 null
【发布时间】:2017-02-05 12:21:27
【问题描述】:

我正在开发一个 MySQL 函数,该函数应该作为 JSON_MERGE(我的部署服务器是 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 的结果为空。你能看到我错过了什么吗?

我将粘贴到完整功能下方。在我的本地环境(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 ;

感谢您的帮助

【问题讨论】:

  • 所涉及的变量的具体数据类型是什么?
  • @ÁlvaroGonzález 都是文本。我在变量名中看到了拼写错误,但在所有函数中都是一样的。这不是错字问题。
  • 我无法复制它(SQLFiddle 不再起作用,所以我不知道如何分享它)。我怀疑您也无法使用那段代码重现它,并且该问题仅发生在您的完整功能中,因为错误在其他地方。我建议你添加一个ELSE 子句只是为了调试。

标签: mysql string-concatenation


【解决方案1】:

我们不得不使用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 ;

【讨论】:

    【解决方案2】:

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

    CONCAT_WS('', v_fianlJson, v_json)
    

    【讨论】:

      猜你喜欢
      • 2018-02-27
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多