2012-06-24 2 views
3

Я создал таблицу и вставил значения, как показано ниже.Обновить только один столбец (следующий столбец), если предыдущий столбец пуст

create table mytable (id INT, col1 INT, col2 INT, col3 INT); 

insert into mytable values 
(1,1,1,NULL), 
(2,1,NULL,NULL); 

То, что я хочу сделать, это обновление col2 если col1 не является нулевым, обновление col3 если col2 не пусто и так далее ... Но только один столбец, чтобы обновить.

Рассмотрите, что я хочу обновить данные для id = 2, тогда необходимо обновить только col2, а не col2, col3, поскольку оба значения равны нулю.

Когда я попытался с нижеследующим запросом, то все столбцы обновляются.

update myTable set 
     col1 = (IF (col1 is null, 9, col1)), 
     col2 = (IF (col2 is null, 9, col2)), 
     col3 = (IF (col3 is null, 9, col3)); 

Что необходимо сделать, чтобы обновить только один столбец.

+0

Ваш код обновляет каждую колонку nul. Поместите условие в колонку раньше! – Samson

+0

Col2 = if col1 is null ... – Samson

+0

На этом проклятом телефоне я не могу редактировать комментарии. Для col2 вам нужно проверить, не был ли col1 недействительным до того, как вы обновите, для col3 проверьте col1 amd col 2 и так далее – Samson

ответ

0

Кажется, что ваш запрос является расширением Update MySql Field (if field is not empty, go to next one)

Вы должны установить значение столбцов проверки в обратном порядке.

update table_name set 
--  more next (4 to n) columns here if required  
    col3 = (case when (col2 is not null and col3 is null) then 7 else col3 end) 
    , col2 = (case when (col1 is not null and col2 is null) then 8 else col2 end) 
    , col1 = (case when (col1 is null) then 9 else col1 end) 
; 

Пример Таблица:

mysql> create table col_values (id INT, col1 INT, col2 INT, col3 INT); 
Query OK, 0 rows affected (0.06 sec) 

mysql> insert into col_values values (1, 1, 1, NULL), (2, 1, NULL, NULL), (3, NULL, NULL, NULL); 
Query OK, 3 rows affected (0.01 sec) 
Records: 3 Duplicates: 0 Warnings: 0 

mysql> select * from col_values; 
+------+------+------+------+ 
| id | col1 | col2 | col3 | 
+------+------+------+------+ 
| 1 | 1 | 1 | NULL | 
| 2 | 1 | NULL | NULL | 
| 3 | NULL | NULL | NULL | 
+------+------+------+------+ 
3 rows in set (0.00 sec) 

mysql> update col_values set 
    ->  col3 = (case when (col2 is not NULL and col3 is NULL) then 7 else col3 end) 
    ->  , col2 = (case when (col1 is not NULL and col2 is NULL) then 8 else col2 end) 
    ->  , col1 = (case when (col1 is NULL) then 9 else col1 end) 
    -> ; 
Query OK, 3 rows affected (0.02 sec) 
Rows matched: 3 Changed: 3 Warnings: 0 

mysql> select * from col_values; 
+------+------+------+------+ 
| id | col1 | col2 | col3 | 
+------+------+------+------+ 
| 1 | 1 | 1 | 7 | 
| 2 | 1 | 8 | NULL | 
| 3 | 9 | NULL | NULL | 
+------+------+------+------+ 
3 rows in set (0.00 sec) 

Вы также можете использовать if функцию в качестве альтернативы case заявления.

mysql> truncate table col_values; 
Query OK, 3 rows affected (0.01 sec) 

mysql> insert into col_values values (1, 1, 1, NULL), (2, 1, NULL, NULL), (3, NULL, NULL, NULL); 
Query OK, 3 rows affected (0.02 sec) 
Records: 3 Duplicates: 0 Warnings: 0 

mysql> select * from col_values; 
+------+------+------+------+ 
| id | col1 | col2 | col3 | 
+------+------+------+------+ 
| 1 | 1 | 1 | NULL | 
| 2 | 1 | NULL | NULL | 
| 3 | NULL | NULL | NULL | 
+------+------+------+------+ 
3 rows in set (0.00 sec) 

mysql> update col_values set 
    ->  col3 = if((col2 is not NULL and col3 is NULL), 7, col3) 
    ->  , col2 = if((col1 is not NULL and col2 is NULL), 8, col2) 
    ->  , col1 = if(col1 is NULL, 9, col1) 
    -> ; 
Query OK, 3 rows affected (0.01 sec) 
Rows matched: 3 Changed: 3 Warnings: 0 

mysql> select * from col_values; 
+------+------+------+------+ 
| id | col1 | col2 | col3 | 
+------+------+------+------+ 
| 1 | 1 | 1 | 7 | 
| 2 | 1 | 8 | NULL | 
| 3 | 9 | NULL | NULL | 
+------+------+------+------+ 
3 rows in set (0.00 sec) 
0

Вы можете сделать это в двух различных проходах, последовательное обновление моды:

UPDATE mytable SET col3 = 9 WHERE col2 IS NOT NULL; 
UPDATE mytable SET col2 = 9 WHERE col1 IS NOT NULL; 

Делать это в таком порядке предотвращает каскадирование обновлений во всех колонках.

+0

hmmm ... второй - хороший выбор ... также позвольте подождать больше ответов ... –

+0

@ Saluce Второй фактически оставляет 'col2' равным нулю и заполняет' col3', что не соответствует ожидаемому OP. OP хочет * обновить col2, если col1 не равен null, обновить col3, если col2 не равен null и т. Д. * –

+0

@Saluce Для требуемого решения вы должны делать обновления в обратном порядке столбцов. –

Смежные вопросы