2017-12-14 23 views
1

나는 각 행에 id이 자동으로 증가하고 NULL 일 수있는 몇 가지 값을 갖는 sqlite3 DB를 가지고있다. 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); 

나는 두 단계로 쉽게 할 수있는, 뭔가 같은 :

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 문을.

+0

왜 발은 null'이고 단지'꼬리에서 삭제 하시겠습니까? sqlite에 익숙하지 않은 사용자도 있으므로 구문에 도움이되지 않습니다. –

+0

@JacobH 다른 계산을 위해 꼬리의 값을 제외하고 모든 val = NULL이 필요합니다. –

답변

1

당신은 사용할 수 있습니다

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); 
+0

고든 감사합니다. BTW,'val이 null이 아니며 '중복되거나 뭔가 놓쳤습니다. –

+0

@ MichałŠrajer. . . 예. 이런 상황에서는 불필요합니다. –