Update only one column (next column) if previous column is empty

匿名 (未验证) 提交于 2019-12-03 08:56:10

问题:

I have created table and inserted values as below.

create table mytable (id INT, col1 INT, col2 INT, col3 INT);  insert into mytable values (1,1,1,NULL), (2,1,NULL,NULL); 

What I want to do is update col2 if col1 is not null, update col3 if col2 is not null and so on... BUT only one column to update.

Consider I want to update data for id=2, then only col2 should be updated and not col2, col3 as both are null.

When I tried with below query, then all columns get updated.

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

What should be done so that only one column gets updated.

回答1:

It seems your query is an extension to Update MySql Field (if field is not empty, go to next one)

You need to set column values checking in the reverse order.

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 )   ; 

Example Table:

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) 

You can also use if function as an alternative to case statement.

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) 


回答2:

You can do it in two distinct passes, a serial update fashion:

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

Doing it in this order prevents the cascading of updates across all columns.



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!