#mysql
#mysql
Вопрос:
Я не понимаю следующие работы
SELECT price, CAST(price AS DECIMAL(10,2)) FROM orders;
Но обновление завершается неудачей с обоими:
UPDATE orders SET price = CAST(price AS DECIMAL(10,2));
UPDATE orders SET price = CAST(CAST(price AS DECIMAL(10,2)) AS CHAR(20));
с ошибкой:
Error Code: 1366. Incorrect DECIMAL value '0' for column '' at row -1
Столбец price
является TEXT
В моем понимании SELECT
должен делать то же самое, что и UPDATE
Комментарии:
1. Вы пропустили
)
в своем запросе на обновление. Кроме того, что, если цена была пустой для некоторой строки или null?2. @vivek_23 Извините за
)
, исправлено сейчас. Цена указанаNULL
за некоторые строки. Но я получаю ту же проблему даже сWHERE price IS NOT NULL
Ответ №1:
В select вы просто показываете результат приведения как десятичный, в update вы сохраняете десятичный в не числовом
Попробуйте привести результат в виде строки к
UPDATE orders SET price = CAST(CAST(ifnull(price,0) AS DECIMAL(10,2) AS char(20));
или, может быть, у вас есть значение, которое не может быть приведено как десятичное, например, немного места для этого, вы можете проверить другое условие, используя регистр
UPDATE orders SET price = CAST(CAST(
CASE when price IS NULL THEN 0
when trim(price) ='' THEN 0
ELSE price
END ) AS DECIMAL(10,2) AS char(20));
Комментарии:
1. Я получаю точно такую же проблему с этим, но вы не можете установить,
VARCHAR
что вы должны использоватьCHAR
вместо этого.2. Совместим ли он с MySQL? Я получаю
"IFNULL" invalid at this position
Ответ №2:
Как вы заявляете:
Столбец
price
являетсяTEXT
.
Итак, в вашем первом примере вы преобразуете текстовое значение в десятичное значение.
Ваш второй запрос (обновление) проблематичен, потому что вы пытаетесь обновить текстовый атрибут до десятичной версии самого себя. Когда вы обновляете текстовое значение, нет необходимости приводить его к десятичной системе счисления.
Ваше заявление,
В моем понимании, ВЫБОР должен выполнять то же самое, что и ОБНОВЛЕНИЕ
ошибка: с SELECT
вы извлекаете данные из своих данных для использования каким-либо другим процессом. Это может включать приведение атрибута к другому типу данных.
С помощью UPDATE
инструкции новое значение должно соответствовать тому же типу данных, что и ваш атрибут. Поскольку price
это текст, новое значение должно быть текстовым (вот почему вы не должны обновлять атрибут до ДЕСЯТИЧНОЙ версии самого атрибута).
Ответ №3:
Возможно, у вас где-то есть пустое значение
CREATE TABLE `orders` (
`price` VARCHAR(100) NOT NULL);
INSERT INTO orders (price) VALUES (''); -- Empty value
Ошибок нет:
SELECT price, CAST(price AS DECIMAL(10,2)) FROM orders;
Ошибка:
UPDATE orders SET price = CAST(price AS DECIMAL(10,2));
Ошибки нет:
UPDATE orders SET price = CAST(price AS DECIMAL(10,2)) WHERE price <> ''
Комментарии:
1. Я думаю, вам также может понадобиться
trim()
это время от времени. Например, что, если бы в какой-либо строке был...196.78....
(предположим, что.
это пробел).