#mysql #sql #case
Вопрос:
Как я могу выполнить запрос на обновление поля в таблице, проверив в самом запросе, пустое поле или нет. Если он пуст, выполните обычное обновление, иначе обновите, добавив запятую с новым значением.
Например:
Скажем, в таблице users
у меня есть поле с именем genders
.
Случай 1: Поле пусто для выбранной строки. Значение обновления male
.
Случай 2: Поле не пустое и имеет значение (например, male
). Обновите с ,female
помощью . Теперь значение поля становится male,female
.
Случай 3: Если поле не пустое и имеет значение, установите флажок, чтобы не повторять обновление. Например, поле есть male,female
, и запрос на обновление выполняется снова, после чего оно будет обновляться male,female,female
в соответствии CASE 2
с . Этого следует избегать.
Я хочу выполнить это в самом запросе. Есть идеи, как это сделать?
Комментарии:
1. Нет, нет, нет, нет! Не храните несколько значений в одном столбце
2. Если вам действительно нужно, то проверьте w3schools.com/mysql/func_mysql_case.asp и w3schools.com/mysql/func_mysql_concat.asp по крайней мере, для целей обучения.
3. @juergend он будет хранить максимум 2 значения. Это не проблема. Здесь не требуется никакой нормализации. Я понимаю важность нормализации, но это только для больших значений или записей.
Ответ №1:
Получите представление о следующем и измените запрос в соответствии с вашими требованиями.
UPDATE users SET genders = CASE
WHEN genders = '' OR genders is null THEN 'male'
WHEN genders ='male' THEN CONCAT(genders,',','female')
WHEN genders ='female' THEN CONCAT(genders,',','male')
ELSE genders
END
Комментарии:
1. Я как раз этим уже занимался, когда ты написал. Но спасибо 🙂
2. Пожалуйста, обновите свой запрос, чтобы проверить
IS NULL
, так ли этоWHEN (genders = '' OR genders IS NULL)
. Это закроет любое отверстие в петле для нулевых или пустых проверок.3. Братан, у меня проблема. Это обновление
male,female,female,female
. Случай 2 повторяется при повторном выполнении запроса. Я обновил вопрос с помощью случая 3.4. надеюсь, ответ поможет
5. Я привел половые признаки только для фиктивного примера. Я использовал здесь идентификатор пользователя, вошедшего в систему. В моем случае мне пришлось использовать
FIND_IN_SET
дляNOT NULL
условий.