SQLITE - 按列切换数据

时间:2009-08-16 17:29:50

标签: sqlite

我有一张包含以下结构的表格:

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查询?

感谢。

3 个答案:

答案 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的唯一方法。