我有一個像這樣的(非常簡化的)(Oracle)表。行號只是為了更好的理解,沒有更深的含義。
| 排 | 價值 |
|---|---|
| 1 | 吉姆 |
| 2 | 約翰 |
| 3 | 麥克風 |
現在我找到了“錯誤”——名字搞砸了。所有“Jims”都應重命名為“John”,John 更改為 Mike,Mike 更改為 Jim。
我的第一次更新將 Jim 更改為 John。我的第二次更新應該將 John 更改為 Mike。
但真正的問題是:現在我有兩個約翰——舊的和重命名的吉姆。如何在不改變其他的情況下找到并修改“老約翰”?
我的想法是使用臨時值:
- Jim to temp_John
- 約翰到 temp_mike
- 邁克對吉姆
- temp_John 到 John
- temp_mike 給 Mike
好主意?還是有更好的?還是完全錯誤的方式?
編輯:我現實,沒有三個名字,而是 700 - 1000 個數字,所以 25 到 345 558 到 2 1 到 38 ...
uj5u.com熱心網友回復:
不,它只是一個UPDATE帶有CASE運算式的單曲:
SQL> select * From test order by crow;
CROW VALU
---------- ----
1 Jim
2 John
3 Mike
SQL> update test set
2 value = case when value = 'Jim' then 'John'
3 when value = 'John' then 'Mike'
4 when value = 'Mike' then 'Jim'
5 end;
3 rows updated.
SQL> select * From test order by crow;
CROW VALU
---------- ----
1 John
2 Mike
3 Jim
SQL>
uj5u.com熱心網友回復:
您可以使用decode:
update test set value = decode(value,'JIM','JOHN','JOHN','MIKE','MIKE','JIM');
db<>在這里擺弄
對于數字,您可以使用負數作為暫時性:
update test value = decode(value, 65537, -7777776777777, value);
update test value = decode(value, 7777776777777, -45, value);
update test value = decode(value, 45, -65537, value);
update test set value = abs(value);
這樣,您可以擁有任意數量的號碼,因為每個號碼使用一個查詢。
更新了db<>fiddle以獲取數字示例
uj5u.com熱心網友回復:
您應該創建一個包含兩列的表:
create table value_pairs
(old_value integer,
new_value integer,
primary key (old_value));
創建表后,您必須插入舊值和新值:
insert into value_pairs values (1, 2);
insert into value_pairs values (2, 3);
etc.
最后運行這條 SQL 陳述句:
update your_table t
set value =
(select new_value
from value_pairs p
where p.old_value = t.value);
在這種情況下,您不必撰寫長 case 或 decode 陳述句。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/430055.html
上一篇:如何按容器及其日期分組
