Проблема с функцией приведения в запросе на обновление - PullRequest
2 голосов
/ 03 марта 2020

Вот простая таблица и тестовые данные, которые я буду использовать для демонстрации своей проблемы:

create table foo(
  id INTEGER AUTO_INCREMENT PRIMARY KEY,
  orderpos int not null
);

insert into foo (orderpos) values (1);
insert into foo (orderpos) values (2);
insert into foo (orderpos) values (3);
insert into foo (orderpos) values (4);
insert into foo (orderpos) values (5);

Я хотел бы обновить некоторые поля с помощью запроса, подобного следующему:

update foo
set orderpos = 
        CAST( 
        CASE 
          WHEN id = 2 THEN 4
          WHEN id = 3 THEN 8
         END
         AS INTEGER 
        )  
where id in(2, 3);

Однако я получаю сообщение об ошибке

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 'INTEGER 
        )  
where id in(2, 3)'

Я понимаю, что при удалении запроса CAST будет работать, но я хотел бы понять, почему эта операция не разрешена?

MySQL составляет 5,6 Вот ссылка на скрипку http://sqlfiddle.com/#! 9 / 420d7f

Ответы [ 2 ]

2 голосов
/ 03 марта 2020

Это правда, что вам не нужно использовать CAST () в этом случае.

Но для записи ошибка в том, что вы используете INTEGER в положении, когда оно не поддерживается синтаксис.

OK:

CAST(<expr> AS SIGNED)
CAST(<expr> AS SIGNED INTEGER)
CAST(<expr> AS UNSIGNED)
CAST(<expr> AS UNSIGNED INTEGER)

НЕПРАВИЛЬНО:

CAST(<expr> AS INTEGER)

См. документацию по CAST() и CONVERT(), чтобы прочитать о поддерживаемом синтаксисе типа данных: https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html

1 голос
/ 03 марта 2020

Нет необходимости в cast(). Просто используйте:

set orderpos = (CASE WHEN id = 2 THEN 4
                     WHEN id = 3 THEN 8
                END)

Если вам нужен cast(), тогда используйте signed или unsigned.

...