首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL根据另一列的值更新列值

SQL根据另一列的值更新列值
EN

Stack Overflow用户
提问于 2016-03-11 13:41:53
回答 2查看 1.4K关注 0票数 2

我正在使用sqlite。我有一张这样的桌子

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

发布于 2016-03-11 13:47:57

下面是一条UPDATE语句,它可以解决您的问题。这不是我最喜欢的答案,因为它会更新所有记录,即使是那些具有与您的条件匹配的j值的记录。这意味着一些触发器可能会不必要地触发。

代码语言:javascript
复制
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语句,那么您可以尝试这样做:

代码语言:javascript
复制
UPDATE t
SET j = j + 10
WHERE i = j + 100 + 10

UPDATE t
SET j = j - 10
WHERE i = j + 100 - 10
票数 3
EN

Stack Overflow用户

发布于 2016-03-11 15:35:54

我最终解决了它,不确定这是最好的方法,但这是我做的。

代码语言:javascript
复制
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

我想还有更优雅的方法可以做到这一点。

干杯,菲

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35933073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档