我有一张桌子。
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}},数字还是文字设置什么类型?
答案 0 :(得分:1)
正如另一位用户所说,关系数据库最适合存储在列中的单个值。也就是说,你可以解析值(通过分隔符拆分),增加数字,将它们连接到一个字符串并更新行。您需要为此创建自定义过程。请参阅string functions和stored 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版上成功测试了这个。