2014-03-31 45 views
0

检查空我想写一个MySQL的函数,拉数值超出被格式化为一个JSON字典的文本字段中。但是,出于某种原因,我无法让嵌套的IF语句在没有语法错误的情况下工作。在MySQL嵌套如果

下面是函数:

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 

对我失去了我的任何想法?

回答

1

key是一个保留字。

要么使用不同的名字,说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`); 

参考MySQL Reserved Words

0

试试这个:

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

周围的状况删除括号和检查;像

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; 
+0

Ravinder抓住了错误,但我投票了这一个以及因为它清理整体结构。 – BringMyCakeBack