2012-04-18 3 views
1

Я пытаюсь написать функцию MySQL, которая возвращает ненулевое значение из двух значений (а, б) ..However, я получаю сообщение об ошибкефункция MySQL, которая возвращает ноны нуля

DELIMITER $$ 
CREATE FUNCTION GetNonNull(a,b) BEGIN 
IF a = NULL THEN RETURN b; ELSE return a; ENDIF; END $$ 
DELIMITER ; 

I получить эту ошибку:

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 'b) BEGIN IF a = NULL THEN RETURN b; ELSE return a; ENDIF; END' at line 1

Любая помощь была бы принята с благодарностью!

+1

Почему бы вы сделать это, есть [COALESCE] (http://dev.mysql.com/doc/refman/5.5/ru/comparison-operators.html#function_coalesce) –

+0

Вы не можете сравнивать 'NULL' с любым значением (даже' NULL') с помощью equals ('='). Как может что-то с неизвестным значением ('NULL') что-то равным? Подумайте об этом: я держу что-то в левом кулаке, и что-то в порядке. Они равны? Вы не можете сказать, потому что вы не представляете, кто из них, где вы находитесь; это похоже на сравнение «NULL». к чему-то. Всегда используйте 'IS NULL' или' IS NOT NULL' при попытке сравнить что-либо с 'NULL', и если у вас есть либо/или использовать' COALESCE', как предлагает @Darhazer. –

ответ

0

Я рекомендую использовать встроенную функцию COALESCE, а не писать собственную функцию.

0

Вам не нужен пункт RETURNS, который показывает, какой тип данных возвращает функция. И вы также должны указать типы данных аргументов. Выезд the documentation

0

Попробуйте

DELIMITER $$ 
CREATE FUNCTION GetNonNull(a INT,b INT) RETURNS INT 
BEGIN 
    IF a IS NULL THEN 
     RETURN b; 
    ELSE 
     return a; 
    ENDIF; 
END $$ 
DELIMITER ; 

или

DELIMITER $$ 
CREATE FUNCTION GetNonNull(a INT,b INT) RETURNS INT 
BEGIN 
    IF ISNULL(a) THEN 
     RETURN b; 
    ELSE 
     return a; 
    ENDIF; 
END $$ 
DELIMITER ; 

или

DELIMITER $$ 
CREATE FUNCTION GetNonNull(a INT ,b INT) RETURNS INT 
BEGIN 
    RETURN IFNULL(a,b); 
END $$ 
DELIMITER ; 

На самом деле, вы могли бы просто заменить хранимую процедуру с IFNULL(a,b)

Смежные вопросы