更新列表值SQLite

时间:2017-11-03 21:58:39

标签: sql sqlite

我有一张桌子。

ID   | VALUE
id_1 | 2, 3, 4, 5, 6
id_2 | 7, 8, 9, 10, 11
id_3 | 12, 13, 14, 15, 16

我需要按值+ = 1更改值,最终表格应如下所示:

VALUE

我该怎么做?是否可以使用SQL查询?我应该为{{1}},数字还是文字设置什么类型?

3 个答案:

答案 0 :(得分:1)

正如另一位用户所说,关系数据库最适合存储在列中的单个值。也就是说,你可以解析值(通过分隔符拆分),增加数字,将它们连接到一个字符串并更新行。您需要为此创建自定义过程。请参阅string functionsstored routines

如果你必须这样做,你应该将列声明为TEXT或VARCHAR;上面显示的列表无法存储到数字列中。

完整的答案是一些繁重的SQL编程问题。即使您提出了一个可行的解决方案,您的程序仅在一个数据库上工作的风险也相当大。

所以:

更简单的方法是通过行和位置的单独ID存储二维数据:

id   | pos | value
------------------
id_1 | 1   | 1
id_1 | 2   | 2
id_1 | 3   | 3
...
id_2 | 1   | 6
...

如果除了特定id的数字列表之外还有其他字段,请创建另一个类似上面的表,其中id是主表中的外键。

然后更新值只是发布

的问题
UPDATE table_name SET value = value + 1

答案 1 :(得分:1)

Python脚本解决方案:

db = sqlite3.connect('Database.db')

cursor = db.cursor()
cursor.execute('SELECT Value FROM Problems')

all_rows = cursor.fetchall()
for row in all_rows:
    array = row[0].split(',')
    new_string = ''
    for id in array:
        if (id != ''):
            id = int(id)
            id += 1
            id = str(id)
            new_string += id + ','
    new_string = new_string[:-1]
    cursor.execute('UPDATE Problems SET Value = ? WHERE Value = ?', (new_string, row[0]))
    db.commit()
db.close

答案 2 :(得分:1)

以下更新有效:

create table t as
  select 'id_1' id, '1, 2, 3, 4, 5'      val union
  select 'id_2' id, '6, 7, 8, 9, 10'     val union
  select 'id_3' id, '11, 12, 13, 14, 15' val;

update t set val=(
  with
  cnt(x) as (select 1 union all select x+1 from cnt limit 999),
  split  as (select id, x from t,cnt where instr(' '||val||',', ' '||x||',')>0)
  select group_concat(x+1,', ') val from split where id=t.id
);

select * from t order by id;

结果:

id_1|2, 3, 4, 5, 6
id_2|7, 8, 9, 10, 11
id_3|12, 13, 14, 15, 16

如果您的值是1和给定限制之间的整数,则在此示例中设置为999。我在Sqlite 3.11版上成功测试了这个。