我如何 select 在 sqlite 中使用空值尾巴?
How do I select tail with nulls in sqlite?
我有一个 sqlite3 数据库,其中每一行都有 auto-incremented id
和一些可以是 NULL
的值。我需要 删除带有空值的尾部 (最好保留该段中最旧的空记录)。
例如,在这里,我想删除带有 id = 12..16(或理想情况下为 13..16)的行。
知道如何在 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);
我可以分两步轻松完成,例如:
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 语句中完成此操作。
您可以使用:
delete from tail
where id > (select max(t2.id) from tail t2 where t2.val is not null) and
val is null and
id <> (select max(t3.id) from tail t3 where t3.val is null);
我有一个 sqlite3 数据库,其中每一行都有 auto-incremented id
和一些可以是 NULL
的值。我需要 删除带有空值的尾部 (最好保留该段中最旧的空记录)。
例如,在这里,我想删除带有 id = 12..16(或理想情况下为 13..16)的行。
知道如何在 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);
我可以分两步轻松完成,例如:
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 语句中完成此操作。
您可以使用:
delete from tail
where id > (select max(t2.id) from tail t2 where t2.val is not null) and
val is null and
id <> (select max(t3.id) from tail t3 where t3.val is null);