私はsqlite3 DBを持っています。各行は自動インクリメントid
となり、値はNULL
になります。私はnullを持つ末尾を削除する必要があります(理想的には、このセグメントから最も古いnullレコードを保持する)。 たとえば、id = 12..16(または理想的には13..16)の行を削除したいと思います。sqliteでNULLを使用してtailを選択するにはどうすればよいですか?
これはどのようにsqliteで行うことができますか?
CREATE TABLE tail (id INTEGER PRIMARY KEY, val TEXT);
INSERT INTO "tail" VALUES(1,'5');
INSERT INTO "tail" VALUES(2,'7');
INSERT INTO "tail" VALUES(3,'100');
INSERT INTO "tail" VALUES(4,'150');
INSERT INTO "tail" VALUES(5,NULL);
INSERT INTO "tail" VALUES(6,NULL);
INSERT INTO "tail" VALUES(7,'120');
INSERT INTO "tail" VALUES(8,'150');
INSERT INTO "tail" VALUES(9,'152');
INSERT INTO "tail" VALUES(10,NULL);
INSERT INTO "tail" VALUES(11,'152');
INSERT INTO "tail" VALUES(12,NULL);
INSERT INTO "tail" VALUES(13,NULL);
INSERT INTO "tail" VALUES(14,NULL);
INSERT INTO "tail" VALUES(15,NULL);
INSERT INTO "tail" VALUES(16,NULL);
私は2つのステップで簡単に行うことができ、何かのように:
to_delete = []
for row in query("SELECT * FROM tail ORDER BY -id"):
if row.id IS NOT NONE:
break
to_delete.add(row.id)
# optionally: to_delete.remove_last()
query("DELETE FROM tail WHERE id IN (?)", to_delete)
しかし、これはトランザクションではない、と私は達成するために使用することができ、いくつかの巧妙なトリックがあるという感覚を持っていますこれは、単一のsqliteステートメントです。
を理由だけ 'valがnull'なのである尾から削除しませんか? sqliteに精通していないので、そこに構文を助けることはできません。 –
@JacobH他の計算のために、末尾のvalを除くすべてのval = NULLが必要です。 –