2009-08-12 15 views
8

Możliwe duplikaty:
Why would a sql query have “where 1 = 1”
Why would someone use WHERE 1=1 AND <conditions> in a SQL clause?Jaki jest cel użycia WHERE 1 = 1 w instrukcjach SQL?

Widziałem, że wiele różnych przykładów zapytań i idzie do prawdopodobnie wszystkie silniki SQL.

Jeśli istnieje zapytanie, które nie ma zdefiniowanych warunków, ludzie (i specjalnie ORMowe frameworki) często dodają zawsze prawdziwy warunek WHERE 1 = 1 lub coś w tym stylu.

Więc zamiast

SELECT id, name FROM users; 

używają

SELECT id, name FROM users WHERE 1 = 1; 

Jedynym możliwym powodem mogę myśleć, jeśli dodajesz warunki dynamicznie nie trzeba się martwić o odpędzenie początkową AND ale wciąż dość często ten warunek 1 = 1 jest usuwany, jeśli w zapytaniu występuje rzeczywisty stan.

Rzeczywisty przykład z CakePHP (generowane przez ramy):

(brak warunków)

SELECT `User`.`id`, `User`.`login` 
FROM `users` AS `User` WHERE 1 = 1 
ORDER BY `User`.`id` ASC; 

(warunku)

SELECT `User`.`id`, `User`.`login` 
FROM `users` AS `User` 
WHERE `User`.`login` = '[email protected]' 
LIMIT 1; 

Czy jest jakiś powód, dodając, że dodatkowym warunkiem?

+1

Dupek z http://stackoverflow.com/questions/517107/why-would-a-sql-query-have-where-1-1 między innymi –

Odpowiedz

4

Tak, zazwyczaj jest to spowodowane tym, że zaczyna się jako "gdzie 1 = 0", aby wymusić zakończenie instrukcji.

To bardziej naiwny sposób na zawijanie go w transakcji, a nie na końcu, aby przetestować zapytanie. (Jest to preferowana metoda).

+0

Może być więcej niż jedna odpowiedź; i w tym przypadku OP był specyficzny, że nie był przeznaczony tylko do budowania dynamicznych zapytań (i szczerze mówiąc, jeśli budujesz dynamiczne zapytania w tych dniach ORMów, dobrze się przyjrzyj). –

2

Używanie 1 = 1 nie jest tak naprawdę dobrym pomysłem, ponieważ może spowodować samo skanowanie pełnych tabel.

Zobacz to ->T-SQL 1=1 Performance Hit

+1

Tylko na najbardziej crappiest DBMS ". – paxdiablo

+1

Wszystkie odpowiedzi w pytaniu, które łączyłeś z informacją 1 = 1, nie mają żadnego wpływu. – Ryan

13

Jest też powszechną praktyką, gdy ludzie są budowania zapytania SQL programowo, to po prostu łatwiej na początek „gdzie 1 = 1”, a następnie dodanie "i customer.id =: custId "w zależności od tego, czy podano identyfikator klienta. Zawsze możesz dołączyć kolejną część zapytania rozpoczynając od "i ...".

+1

-1 Powtarza się to pytanie, które mówi: "nie musisz się martwić o usunięcie początkowego I" – Andomar

1

Jak powiedział:

jeśli dodajesz warunki dynamicznie nie trzeba się martwić o stripping początkowego i to jedyny powód może być, masz rację.

4

1 = 1 jest ignorowany przez zawsze wszystkie rdbms.Nie ma kompromisu podczas wykonywania zapytania z WHERE 1 = 1.

Budowanie dynamiczne warunki, takie jak ram ORM lub inny zrobić bardzo często łatwiej jest dołączać prawdziwy warunki, ponieważ pozwala uniknąć sprawdzania poprzedzenie się I do obecnego stanu.

stmt += "WHERE 1=1"; 
if (v != null) { 
    stmt += (" AND col = " + v.ToString()); 
} 

Oto jak to wygląda bez 1 = 1.

var firstCondition = true; 
... 
if (v != null) { 
    if (!firstCondition) { 
     stmt += " AND "; 
    } 
    else { 
     stmt += " WHERE "; 
     firstCondition = false; 
    } 
    stmt += "col = " + v.ToString()); 
} 
+1

Właściwie, mam tendencję do zrobienia czegoś takiego: cmd = "select ..."; sep = "where"; foreach (cond) {cmd + = sep + cond; sep = "i"; } – paxdiablo

+0

Co wygląda * trochę * czystsze. – paxdiablo

+0

Dobry pomysł! Pamiętam o dalszym programowaniu. – Christian13467

3

Ludzie używają go, ponieważ są z natury leniwi podczas budowania dynamicznych zapytań SQL. Jeśli zaczynasz od "where 1 = 1", wszystkie dodatkowe klauzule zaczynają się od "and" i nie musisz się domyślać.

Nie chodzi o to, że coś jest nie tak z natury leniwego. Widziałem podwójnie powiązane listy, w których "pusta" lista składa się z dwóch węzłów wartowniczych i rozpoczyna się przetwarzanie pod first->next aż do last->prev włącznie.

To faktycznie usunął wszystkie specjalne kody obsługi usuwania węzłów first i last. W tym zestawie każdy węzeł był węzłem środkowym, ponieważ nie można było usunąć first ani last. Dwa węzły zostały zmarnowane, ale kod był prostszy i (nieco mniejszy) szybszy.

Jedyne inne miejsce, w jakim kiedykolwiek widziałem konstrukcję "1 = 1" znajduje się w teście BIRT. Raporty często używają parametrów pozycyjnych i są modyfikowane przez JavaScript, aby umożliwić wszystkie wartości. Więc zapytanie:

select * from tbl where col = ? 

gdy użytkownik wybierze "*" parametru używany do col jest modyfikowany w brzmieniu:

select * from tbl where ((col = ?) or (1 = 1)) 

Pozwala to nowa kwerenda być wykorzystywane bez błahy wokół z parametrem pozycyjnym Detale. Wciąż jest dokładnie jeden taki parametr. Każdy przyzwoity system zarządzania bazami danych (np. DB2/z) zoptymalizuje to zapytanie, aby w zasadzie usunąć klauzulę całkowicie przed próbą skonstruowania planu wykonania, więc nie ma kompromisu.

+0

Dzięki stary! To była najbardziej wiarygodna odpowiedź! –