检查MySQL中的Null嵌套如果

检查MySQL中的Null嵌套如果,mysql,json,if-statement,Mysql,Json,If Statement,我正在尝试编写一个MySQL函数,从格式化为JSON dict的文本字段中提取一个值。但是,由于某些原因,我无法使嵌套的IF语句在没有语法错误的情况下工作 以下是函数: DROP FUNCTION IF EXISTS json_key; DELIMITER $$ CREATE FUNCTION `json_key`(`col` TEXT, `key` VARCHAR(255)) RETURNS VARCHAR(255) DETERMINISTIC BEGIN DECLARE ret V

我正在尝试编写一个MySQL函数,从格式化为JSON dict的文本字段中提取一个值。但是,由于某些原因,我无法使嵌套的IF语句在没有语法错误的情况下工作

以下是函数:

DROP FUNCTION IF EXISTS json_key;
DELIMITER $$

CREATE FUNCTION `json_key`(`col` TEXT, `key` VARCHAR(255)) RETURNS VARCHAR(255)
DETERMINISTIC
BEGIN
    DECLARE ret VARCHAR(255);
    DECLARE pos INT;
    IF (col IS NULL) THEN SET ret = "";
    ELSEIF (col = "") THEN SET ret =  "";
    ELSEIF (LOCATE(key, col) = 0) THEN SET ret =  "";
    ELSE 
        SET pos := LOCATE(key, col);
        SET len := LENGTH(key);
        SET bg  := pos + len;
        SET ret = SUBSTR(col, bg, LOCATE('"', col, bg) - bg));
    END IF;
    RETURN ret;
END $$
DELIMITER ;
以下是我得到的错误:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to 
use near 'key, col) = 0) THEN SET ret =  "";

ELSE 
SET pos := LOCATE(key, col);
SET len :=' at line 7
知道我遗漏了什么吗?

试试这个:

SET len := (coalesce(LENGTH(key),0));

移除条件周围的括号并检查;像

ELSEIF LOCATE(key, col) = 0 THEN SET ret =  "";
你也可以像检查一样改变你的状况

IF (col IS NULL OR  col = "" OR LOCATE(key, col) = 0) THEN SET ret = "";
ELSE 
    SET pos := LOCATE(key, col);
    SET len := LENGTH(key);
    SET bg  := pos + len;
    SET ret = SUBSTR(col, bg, LOCATE('"', col, bg) - bg));
END IF;

是保留字

或者使用不同的名称,比如说
jKey
,或者使用反勾(`)使其被接受

更改这些行

ELSEIF (LOCATE(key, col) = 0) THEN SET ret =  "";
ELSE 
    SET pos := LOCATE(key, col);
    SET len := LENGTH(key);
ELSEIF (LOCATE(`key`, col) = 0) THEN SET ret =  "";
ELSE 
    SET pos := LOCATE(`key`, col);
    SET len := LENGTH(`key`);

ELSEIF (LOCATE(key, col) = 0) THEN SET ret =  "";
ELSE 
    SET pos := LOCATE(key, col);
    SET len := LENGTH(key);
ELSEIF (LOCATE(`key`, col) = 0) THEN SET ret =  "";
ELSE 
    SET pos := LOCATE(`key`, col);
    SET len := LENGTH(`key`);

参考

Ravinder发现了这个错误,但我也投了赞成票,因为它清理了整个结构。