MySQL обновляет поле с запятой, если значение уже существует

#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 условий.