我有一张包含以下结构的表格:
CREATE TABLE "mytable" ("column01" INTEGER NOT NULL , "column02" INTEGER NOT NULL )
我想在列之间切换值 - 我希望column02成为column01而column01成为column02。
即:
column01 / column02
apple / 01
day / 05
light / 28
我希望它成为:
column01 / column02
01 / apple
05 / day
28 / light
有没有办法实现这一点,只使用SQL查询?
感谢。
答案 0 :(得分:10)
我刚测试了下面的查询,它确实有效:
update mytable set column01 = column02, column02 = column01
答案 1 :(得分:0)
我不能在这里尝试,但这可能会奏效。它是 swap ,不需要临时变量。
算法是:
x -= y;
y += x; // y gets the original value of x
x = (y - x); // x gets the original value of y
这样会使你的UPDATE
语句成为这样:
UPDATE mytable
SET column01 = column01 - column02,
column02 = column02 + column01,
column01 = column02 - column01
只有在按照从左到右的顺序评估列时才会有效,并且它们会在适当的位置进行评估,而不是从缓冲区的快照中进行评估,我相信就是这种情况对于SQLite。
答案 2 :(得分:-1)
SQLITE在允许的ALTER表命令中受到极大限制。正如官方项目网站所述:
SQLite支持有限的子集 更改表。 ALTER TABLE命令 在SQLite中允许用户重命名 表或添加新列到 现有表格。这是不可能的 重命名列,删除列或 添加或删除a的约束 表
因为这个,并且因为你要交换的两列似乎是不同的类型(INTEGER和VARCHAR),我认为你需要将表内容导出为sql / csv,删除表,创建一个表与您想要的结构,然后将您删回的文件导入该表。
一种可能的方法:
sqlite> .output my_outfile.sql
这会将输出从屏幕上显示更改为写入文件。
sqlite> .dump my_table
此方法将CREATE TABLE SQL和所有INSERT语句转储为事务。您需要使用vi或其他编辑器修改my_outfile.sql以手动删除CREATE TABLE语句,我认为您还需要删除BEGIN,END事务命令,因为我无法使用它们导入数据。
sqlite> .output stdout
这将使您的“愿景”恢复,因为命令输出将再次显示在您的屏幕上。
sqlite> CREATE TABLE. . .
使用所需的列顺序重新创建表,确保正确更改类型(INTEGER / VARCHAR)。
sqlite> .read my_outfile.sql
这将执行您之前转储的文件中的所有SQL命令,这将导致实现您所追求的目标,因为转储的INSERT语句不会将列名与特定值相关联。
所以,应该这样做。有点冗长,但它可能是sqlite的唯一方法。