MySQL: код ошибки: 1292. Усеченное неверное значение DOUBLE - PullRequest
0 голосов
/ 19 октября 2019

Я пытаюсь создать хранимую функцию, которая проверяет наличие нескольких вещей в базе данных, возвращая логическое утверждение false, если хотя бы один существует, и true, если таковых не существует.

В частности, есть несколько таблиц, к которым я присоединяюсь, а именно: BurgerOrder, Patties, Buns.

Таблица BurgerOrder содержит PattyID (мясо в бургере) и BunID (тип хлеба). Обратите внимание, что в гамбургере может быть 2 пирожка. Вот что я попробовал.

DELIMITER //

CREATE FUNCTION PattyTest(BunCode INT)
RETURNS VARCHAR(5) DETERMINISTIC

BEGIN 
    DECLARE Result VARCHAR(5);

    IF BunCode NOT IN (SELECT B.ID 
                        FROM BurgerOrder BO JOIN Patties P JOIN Buns B 
                        ON B.ID = BO.BunID AND P.ID = B.PattyID 
                        WHERE B.Type = 'sourdough' OR P.Type = 'Grilled Chicken' or 'Beef') 
                        THEN SET Result = TRUE;

    ELSE SET Result = FALSE;

    END IF;

    RETURN Result;

END //

DELIMITER ;

Есть пара вещей, в которых я не уверен. Он возвращает VARCHAR (5), потому что я не смог найти логический тип данных. В настоящее время он возвращает 1 или 0 как истинное и ложное.

Во-вторых, я полагаю, что эта функция, кажется, работает нормально, когда я ее тестирую, с одной ошибкой.

Код ошибки:1292. Сокращенное неверное значение DOUBLE: 'Beef'

Я хочу, чтобы функция возвращала значение True, когда хлеб из говядины, курицы или закваски находится в каком-либо определенном порядке бургера, который я тестирую. Но я думаю, что причина в том, что у гамбургера, в который я вхожу, есть 2 мясных котлета внутри. Когда я запускаю вышеупомянутую функцию, она работает нормально. Это только когда я вызываю функцию (EG Select PattyTest (23)) показывает код ошибки 1292.

Странно SQL показывает сообщение об ошибке один раз, затем продолжает нормально работать и возвращает правильные результаты.

Любая помощь очень ценится!

Ответы [ 3 ]

0 голосов
/ 19 октября 2019

Это сообщение означает, что вы пытаетесь сравнить число и строку в предложении WHERE или ON, либо убедитесь, что они имеют аналогичные объявления, либо используйте явный CAST для преобразования числа в строку.

0 голосов
/ 19 октября 2019

Я полагаю, что есть проблема в WHERE Clause P.Type = 'Grilled Chicken' или 'Beef' с модулем DB Multiple OR, пытающимся оценить 'Beef' как отдельное условие

изменить его на

ГДЕ B.Type = 'закваска' ИЛИ ​​P.Type in ('Курица-гриль' или 'Говядина')

0 голосов
/ 19 октября 2019

Вы пропустили в предложении where столбец сравнения

Используйте это вместо

DELIMITER //

CREATE FUNCTION PattyTest(BunCode INT)
RETURNS VARCHAR(5) DETERMINISTIC

BEGIN 
    DECLARE Result VARCHAR(5);

IF BunCode NOT IN (SELECT B.ID 
                    FROM BurgerOrder BO JOIN Patties P JOIN Buns B 
                    ON B.ID = BO.BunID AND P.ID = B.PattyID 
                    WHERE B.Type = 'sourdough' OR P.Type = 'Grilled Chicken' or P.Type = 'Beef') 
                    THEN SET Result = TRUE;

ELSE SET Result = FALSE;

END IF;

RETURN Result;

END //

DELIMITER ;
...