我正在使用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应该会有帮助,但到目前为止我还不能做到,我的问题是关于“exist”,我如何在UPDATE中检查一个计算的“i”是否存在。
提前谢谢,干杯。Phi
发布于 2016-03-11 13:47:57
下面是一条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发布于 2016-03-11 15:35:54
我最终解决了它,不确定这是最好的方法,但这是我做的。
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我想还有更优雅的方法可以做到这一点。
干杯,菲
https://stackoverflow.com/questions/35933073
复制相似问题