MySQL обновляет значения столбца с помощью нескольких условий

#mysql #sql #sql-update #case #heidisql

#mysql #sql #sql-обновление #случай #heidisql

Вопрос:

Я новичок в MySQL, и в настоящее время я пытаюсь научиться работать с ним более эффективно. В этом случае у меня есть база данных, в которой указаны доходы людей, и я хочу создать новый столбец income_level с указанием низкого, среднего или высокого дохода в зависимости от дохода. Я сделал это в четырех запросах, но я уверен, что это можно было бы сделать более эффективно? Может кто-нибудь дать мне советы по этому поводу? Спасибо!

Вот мои запросы до сих пор:

 ALTER TABLE Chile
ADD COLUMN `income_level` VARCHAR(50) NULL DEFAULT NULL AFTER `income`;

UPDATE Chile SET income_level = "Low income"
WHERE income < 10000;

UPDATE Chile SET income_level = "Middle income"
WHERE income > 10000;

UPDATE Chile SET income_level = "High income"
WHERE income > 100000;
  

Комментарии:

1. Обычно вы не храните производные данные

2. Просто из любопытства: есть ли у вас одна таблица для каждой страны, как Chile предлагается?

3. @Filburt, да, это правильно. Но наборы данных, которые я использую, предназначены исключительно для практики и не содержат точных и / или реальных данных.

4. @coderfrombiz Если вы знаете о последствиях, это, конечно, хорошо — однако это может помочь добавить этот контекст (подготовка неструктурированных данных для анализа) к вашему вопросу, поскольку вы можете видеть, что ответы и комментарии имеют тенденцию «Но вы делаете это неправильно!» , что вызвано некоторымиказалось бы, плохие проектные решения для СУБД.

Ответ №1:

Решение GMB на 100% правильное, но я бы все равно так не поступил. Вам не нужен дополнительный столбец income_level, потому что вы можете динамически выбирать его. Таким образом, вы также избежите необходимости обновления избыточного столбца, когда определение уровней дохода изменяется, например, из-за инфляции или других причин.

Итак, в этом году ваш запрос может быть таким:

 SELECT CASE WHEN income > 100000 THEN 'High income'
            WHEN income >  10000 THEN 'Middle income'
            ELSE 'Low income' 
        END AS income_level
FROM chile
  

Через пять лет это может выглядеть так:

 SELECT CASE WHEN income > 150000 THEN 'High income'
            WHEN income >  15000 THEN 'Middle income'
            ELSE 'Low income' 
        END AS income_level
FROM chile
  

ОБНОВЛЕНИЕ: если доход может быть нулевым, и вы не хотите считать это «низким доходом», вы можете сделать это:

 SELECT CASE WHEN income IS NULL  THEN 'Unknown income level'
            WHEN income > 100000 THEN 'High income'
            WHEN income >  10000 THEN 'Middle income'
            ELSE 'Low income' 
        END AS income_level
FROM chile
  

Ответ №2:

Используйте case выражение:

 update chile
set income_level = case
    when income > 100000 then 'High income'
    when income >  10000 then 'Middle income'
    else 'Low income'
end
  

Если income это возможно null , и вы не хотите обновлять соответствующие строки, вы можете добавить where предложение к запросу.

Ответ №3:

На самом деле, хотя ответ GMB правильный, я довольно сильно не согласен с rf1234. Вы не хотите реализовывать эту логику в SELECT запросах, потому что логика распространяется на слишком большой объем кода. Вы могли бы использовать представление, но есть лучшее решение.

На мой взгляд, лучшим подходом для вычисления income_level является использование сгенерированного столбца:

 alter table chile
    add income_level varchar(255) generated always as
        (case when income > 100000 then 'High income'
              when income >  10000 then 'Middle income'
              else 'Low income'
         end);
  

Почему это улучшение? Столбцы income_level и income всегда синхронизированы, потому income_level что вычисляется при его извлечении. Итак, если вы добавляете новые строки или обновляете существующие строки, значение автоматически изменяется.