我正在使用sqlite。我有这样一张桌子
create table t (i integer, j integer)
insert into t values(100,210)
insert into t values(200,290)
insert into t values(300,100)
insert into t values(400,500)
I'd like to adjust the j column so that
* j=j+10 if i=j+10 exist
* j=j-10 if i=j-10 exist
After the adjust the table would look like
select i,j from t
i j
--- ---
100 200
200 300
300 100
400 500
是否有允许这样的UPDATE语法,或者我应该使用托管语言进行循环(在我的情况下为C)
我试着阅读UPDATE语句BNF,我猜CASE,应该有所帮助,但到目前为止我无法做到,我的问题是关于'存在'我如何检查UPDATE内部,计算'i'存在。
提前谢谢,欢呼。披答案 0 :(得分:3)
这是一个适用于您的问题的UPDATE
语句。这不是我最喜欢的答案,因为它会更新所有记录,即使是那些符合您标准的j
值的记录。这意味着某些触发器可能会不必要地触发。
UPDATE t
SET j = CASE WHEN i = j + 100 + 10 THEN j + 10
WHEN i = j + 100 - 10 THEN j - 10
ELSE j
END
如果你不介意两个单独的UPDATE
语句,那么你可以试试这个:
UPDATE t
SET j = j + 10
WHERE i = j + 100 + 10
UPDATE t
SET j = j - 10
WHERE i = j + 100 - 10
答案 1 :(得分:0)
我终于解决了它,不确定它是最好的方法,但这就是我的工作。
Before
select * from t
i j
--- ---
100 210
200 290
300 100
400 500
First pass, fix the j with j+10 were we can find i=j+10
update t set j=j+10 where rowid in
(select t.rowid from t,t as u where t.j+10=u.i)
select * from t
i j
--- ---
100 210
200 300 <== only this got corectly updated
300 100
400 500
Second pass fix the j with j-10 were we can find i=j-10
update t set j=j-10 where rowid in
(select t.rowid from t,t as u where t.j-10=u.i)"
select * from t
i j
--- ---
100 200 <== only this one corectly updated
200 300
300 100
400 500
我想有更优雅的方法可以做到这一点。
干杯, 披