SQLite更新字段(如果包含)

时间:2020-03-06 14:54:28  来源:igfitidea点击:

给定一个名为" widget_ids"的数据库字段,其中包含诸如" 67/797/124 /"或者" 45 /"之类的数据,其中的数字以斜杠分隔的widget_ids ...如何使用SQL编写一条更新语句,内容如下:
"如果标识为X的行的widget_ids包含文本" somenumber /",则不执行任何操作,否则将" somenumber /"添加到其当前值"

我们可以使用SQL或者更具体的说是sqlite做类似的事情吗?是出于某种原因在程序中做得更好的事情,还是在SQL中支持" if-then"之类的语法?

解决方案

更新有点像if-thens本身,大多数SQL实现中也有if-then支持。一个简单的解决方案可能是:

update <tablename>
  set widget_id = widget_id + "somenumber/"
  where row_id = X
    and widget_id not like "%/somenumber/%"
    and widget_id not like "somenumber/%";

首先,摆脱符号分隔列表。使用另一张表,每行一个窗口小部件ID。

CREATE TABLE ThingieWidgets (
  thingie_id INT REFERENCES Thingies,
  widget_id INT REFERENCES Widgets,
  PRIMARY KEY(thingie_id, widget_id)
);

用斜杠分隔列表中的值填充表:

INSERT INTO ThingieWidgets (thingie_id, widget_id)
  VALUES (1234, 67), (1234, 797), (1234, 124);

现在,我们可以测试Thingie 1234是否引用了小部件45:

SELECT * FROM ThingieWidgets
WHERE thingie_id = 1234 AND widget_id = 45;

如果存在重复的密钥错误,我们可以尝试插入和恢复:

INSERT INTO ThingieWidgets (thingie_id, widget_id)
  VALUES (1234, 45);