Выбрать с помощью ПРИВЕДЕНИЯ: успех; Обновить с помощью ПРИВЕДЕНИЯ: сбой

#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.... (предположим, что . это пробел).