2012-03-18 12 views
32

Czy jest to najlepszy (najbardziej skuteczny) sposób sprawdzania, czy wiersz istnieje w tabeli?Prawidłowe zapytanie, aby sprawdzić, czy wiersz istnieje w SQLite3

SELECT EXISTS(SELECT 1 FROM myTbl WHERE u_tag="tag"); 
// Table is... 
// CREATE TABLE myTbl(id INT PRIMARY KEY, u_tag TEXT); 

Również to, co jest wartością powrót do tego, że jest fałszywa (bool) lub 0 (int) lub NULL?

Odpowiedz

8

Ponownie cytuje the documentation:

EXISTS operatora zawsze ma wartość jeden z liczb całkowitych od 0 do 1. W przypadku realizacji SELECT określony jako argument operacji prawej EXISTS operatora zwróci jeden lub więcej wierszy, wówczas EXISTS operator ma wartość 1. Jeżeli wykonanie SELECT wróci nie wierszy w ogóle, to EXISTS operator ocenia 0.

co do tego, czy za pomocą EXISTS jest bardziej efektywne niż, powiedzmy , używając count(*), która może de zależnie od wielkości tabeli i od tego, czy tabela ma indeks. Wypróbuj EXPLAIN dla obu zapytań do testu porównawczego (lub po prostu dla każdego z nich).

61

Chcesz, aby nastąpiło zwarcie, gdy tylko znajdzie. Dodanie limitu predykatu zapewni to.

SELECT EXISTS(SELECT 1 FROM myTbl WHERE u_tag="tag" LIMIT 1); 

Dokumentacja nie oznacza, że ​​dla Państwa wystąpiły zwarcia EXISTS.

Cokolwiek zwrócisz, powinno być równoznaczne, chociaż teoretycznie coś zawartego w indeksie, którego używa twoje zapytanie, może być wpisane bezpośrednio w indeksie. Zwrócenie 1 jest prawdopodobnie takie samo.

Umieść indeks w polu znacznika.

EXISTS stwierdza, że ​​zwróci 1 lub 0, a nie zero.

+0

Przekazując to surowe zapytanie do kursora, w jaki sposób mogę uzyskać 0 lub 1 z kursora? Czy jest to kursor.getInt (0), cursor.getCount(), czy cursor.getColumnCount()? –

+3

'EXISTS' zawsze zwraca wynik, więc sprawdzanie wartości będzie działało. –

+1

Aby być pewnym, sprawdzanie wartości kursor dla int byłoby getInt (0) prawidłowe? –

Powiązane problemy