Dlaczego ktoś miałby używać WHERE 1=1 AND <conditions>
klauzuli SQL (albo SQL uzyskany przez połączone łańcuchy, albo zobacz definicję)
Widziałem gdzieś, że byłoby to użyte do ochrony przed SQL Injection, ale wydaje się to bardzo dziwne.
Gdyby zastrzyk WHERE 1 = 1 AND injected OR 1=1
miał taki sam wynik jak injected OR 1=1
.
Późniejsza edycja: co z użyciem w definicji widoku?
Dziękuję Ci za Twoje odpowiedzi.
Nadal nie rozumiem, dlaczego ktoś miałby użyć tej konstrukcji do zdefiniowania widoku lub użyć jej w procedurze przechowywanej.
Weźmy na przykład:
CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1 AND table.Field=Value
sql
dynamic-sql
Bogdan Maxim
źródło
źródło
Odpowiedzi:
Jeśli lista warunków nie jest znana w czasie kompilacji i zamiast tego jest budowana w czasie wykonywania, nie musisz się martwić, czy masz jeden, czy więcej niż jeden warunek. Możesz wygenerować je wszystkie w następujący sposób:
i połączyć je wszystkie razem. Z
1=1
na początku, początkowaand
ma coś do obcowania z.Nigdy nie widziałem tego używanego do jakiejkolwiek ochrony przed wstrzyknięciem, ponieważ mówisz, że nie wydaje się, aby to bardzo pomogło. Ja nie widziałem go stosować jako wygody realizacji. Mechanizm zapytań SQL zostanie zignorowany,
1=1
więc nie powinien mieć wpływu na wydajność.źródło
where 1=1
(Oracle) lubwhere true
(Postgres) będę musiał sprawdzić dla każdego warunku, czy jest to pierwszy. Nie ma sensu, aby to robić, a to tylko dodaje więcej kodu na tablicy.Wystarczy dodać przykładowy kod do odpowiedzi Grega:
źródło
Widziałem to używane, gdy liczba warunków może być zmienna.
Możesz konkatenować warunki, używając ciągu „AND”. Następnie zamiast zliczać liczbę warunków, które przechodzisz, umieszczasz „WHERE 1 = 1” na końcu swojej podstawowej instrukcji SQL i rzucasz konkatenowane warunki.
Zasadniczo oszczędza to konieczności przeprowadzania testu warunków, a następnie dodawania przed nimi łańcucha „GDZIE”.
źródło
Wydaje się to leniwym sposobem, aby zawsze wiedzieć, że twoja klauzula WHERE jest już zdefiniowana i pozwala ci dodawać warunki bez konieczności sprawdzania, czy jest to pierwsza.
źródło
where 1=1
(Oracle) lubwhere true
(Postgres) będę musiał sprawdzić dla każdego warunku, czy jest to pierwszy. Nie ma sensu, aby to robić, a to tylko dodaje więcej kodu na tablicy.WHERE 1=1
rodzi się dodatkowa praca polegająca na utrzymywaniu tego samego kodu w wielu miejscach i odczytywaniu go we wszystkich wygenerowanych kodach SQL. Myślę, że jestem leniwy!Pośrednio istotne: gdy stosuje się 1 = 2:
spowoduje to utworzenie nowej tabeli o takim samym schemacie jak stara tabela. (Bardzo przydatne, jeśli chcesz załadować dane do porównań)
źródło
Wyrażenie 1 = 1 jest powszechnie używane w generowanym kodzie SQL. To wyrażenie może uprościć generowanie kodu SQL, zmniejszając liczbę instrukcji warunkowych.
źródło
W rzeczywistości widziałem tego rodzaju rzeczy używane w raportach BIRT. Zapytanie przekazane do środowiska wykonawczego BIRT ma postać:
i „?” w czasie wykonywania jest zastępowany rzeczywistą wartością parametru wybraną z rozwijanego pola. Opcje w menu rozwijanym są podane przez:
aby uzyskać wszystkie możliwe wartości plus „
*
”. Jeśli użytkownik wybierze „*
” z listy rozwijanej (co oznacza, że należy wybrać wszystkie wartości a), zapytanie musi zostać zmodyfikowane (przez Javascript) przed uruchomieniem.Od „?” jest parametrem pozycyjnym i MUSI pozostać tam, aby działały inne rzeczy, JavaScript modyfikuje zapytanie tak, aby było:
To w zasadzie usuwa efekt klauzuli where, jednocześnie pozostawiając parametr pozycyjny na miejscu.
Widziałem także przypadek AND używany przez leniwych programistów podczas dynamicznego tworzenia zapytania SQL.
Załóżmy, że musisz dynamicznie utworzyć zapytanie, które zaczyna się
select * from t
i sprawdza:niektórzy dodaliby pierwszą z GDZIE, a kolejną z AND:
Leniwi programiści (i to niekoniecznie zła cecha) nie rozróżnią dodanych warunków, zaczną od
select * from t where 1=1
i po prostu dodadzą klauzule AND.źródło
where 1=1
(Oracle) lubwhere true
(Postgres) będę musiał sprawdzić dla każdego warunku, czy jest to pierwszy. Nie ma sensu, aby to robić, a to tylko dodaje więcej kodu na tablicy.Przydał mi się ten wzór podczas testowania lub podwójnego sprawdzania rzeczy w bazie danych, dzięki czemu mogę bardzo szybko skomentować inne warunki:
zamienia się w:
źródło
gdzie 1 = 0, Odbywa się to w celu sprawdzenia, czy tabela istnieje. Nie wiem, dlaczego użyto 1 = 1.
źródło
Chociaż widzę, że 1 = 1 przydałby się w wygenerowanym SQL, techniką, której używam w PHP jest utworzenie tablicy klauzul, a następnie wykonanie
w ten sposób unikając problemu posiadania wiodącego lub końcowego AND. Oczywiście jest to przydatne tylko wtedy, gdy wiesz, że będziesz mieć co najmniej jedną klauzulę!
źródło
Oto ściśle powiązany przykład: użycie
MERGE
instrukcji SQL do zaktualizowania tabeli docelowej przy użyciu wszystkich wartości z tabeli źródłowej, w której nie ma wspólnego atrybutu, na którym można by dołączyć, np.źródło
Ja widziałem ramy fałszem robić rzeczy tak ( rumieniec ), gdyż pozwala to na leniwe praktyki parsowanie być stosowane zarówno do
WHERE
iAND
słów kluczowych SQL.Na przykład (używam C # jako przykładu tutaj), rozważ warunkowe analizowanie następujących predykatów w zapytaniu Sql
string builder
:„Korzyść”
WHERE 1 = 1
oznacza, że nie jest potrzebny żaden specjalny kod:AND
jest wymagany. Ponieważ mamy już co najmniej jeden predykat z1 = 1
, oznacza to, żeAND
zawsze jest OK.WHERE
należy je usunąć. Ale znowu możemy być leniwi, ponieważ znów jesteśmy gwarancją co najmniej jednego orzeczenia.Jest to oczywiście zły pomysł i zaleciłby użycie ustalonej struktury dostępu do danych lub ORM do analizowania opcjonalnych i warunkowych predykatów w ten sposób.
źródło
WHERE 1=1
jest uczciwym wskaźnikiem, któryWHERE 1=1
wcale tak nie jest, że baza kodu jest zaśmiecona kawałkami ciągów , co wskazywałoby mi na problem architektury aplikacji, i nie sądzę, że jedyny!Jeśli przyszedłeś tu szukać
WHERE 1
, zauważ toWHERE 1
iWHERE 1=1
są identyczne.WHERE 1
jest używany rzadko, ponieważ niektóre systemy baz danych odrzucają go, ponieważWHERE 1
nie są tak naprawdę boolowskie.źródło
Jest to przydatne w przypadku, gdy trzeba użyć zapytania dynamicznego, w którym w klauzuli należy dołączyć niektóre opcje filtrowania. Tak jak w przypadku włączenia opcji 0 dla statusu jest nieaktywny, 1 dla aktywnego. Oparte na opcjach, są tylko dwie dostępne opcje (0 i 1), ale jeśli chcesz wyświetlić Wszystkie rekordy, dobrze jest umieścić w miejscu, gdzie close 1 = 1. Zobacz próbkę poniżej:
źródło
Po przejrzeniu wszystkich odpowiedzi postanowiłem przeprowadzić eksperyment
Potem sprawdziłem z innymi numerami
ect Po wykonaniu wszystkich kontroli miasto uruchomione w zapytaniu jest takie samo. nawet bez klauzuli where. Nie jestem fanem składni
źródło
Robię to zwykle, gdy buduję dynamiczny SQL dla raportu, który ma wiele wartości rozwijanych, które użytkownik może wybrać. Ponieważ użytkownik może lub nie może wybrać wartości z każdego menu rozwijanego, w rezultacie trudno nam ustalić, który warunek był pierwszą klauzulą where. Wypełniamy więc zapytanie
where 1=1
na końcu znakiem i dodajemy wszystkie klauzule where po tym.Coś jak
Następnie zbudujemy taką klauzulę where i przekażemy ją jako wartość parametru
Ponieważ wybór klauzuli where nie jest nam znany w czasie wykonywania, pomaga nam to w ustaleniu, czy dołączyć
'AND' or 'WHERE'.
źródło
Użycie predykatu podobnego
1=1
jest normalną wskazówką, która czasami jest używana do wymuszenia, aby plan dostępu używał lub nie korzystał ze skanowania indeksu. Powodem tego jest użycie wielo-zagnieżdżonego zapytania połączonego z wieloma predykatami w klauzuli where, w którym czasami nawet użycie wszystkich indeksów powoduje, że plan dostępu odczytuje każdą tabelę - pełne skanowanie tabeli. Jest to tylko jedna z wielu wskazówek używanych przez DBA, aby oszukać dbms w celu użycia bardziej wydajnej ścieżki. Po prostu nie wrzucaj jednego; potrzebujesz dba do analizy zapytania, ponieważ nie zawsze działa.źródło
Oto przypadek użycia ... jednak nie martwię się zbytnio o szczegóły techniczne, dlaczego powinienem używać 1 = 1. Piszę funkcję, używając pyodbc do pobierania niektórych danych z SQL Server. Szukałem sposobu wymuszenia wypełniacza po
where
słowie kluczowym w moim kodzie. To była naprawdę świetna sugestia:Powodem jest to, że nie mogłem zaimplementować słowa kluczowego „where” razem w zmiennej klauzula _where. Tak więc myślę, że użycie dowolnego warunku fikcyjnego, który ma wartość true, może być wypełniaczem.
źródło
Po raz pierwszy natknąłem się na to z ADO i klasycznym boleniem, odpowiedź dostałem: wydajność. jeśli zrobisz strita
Select * from tablename
i przekaż to jako polecenie / tekst sql, otrzymasz zauważalny wzrost wydajności dzięki
Where 1=1
dodano, to była widoczna różnica. coś wspólnego z zwracaniem nagłówków tabel, gdy tylko pierwszy warunek zostanie spełniony, lub jakimś innym szaleństwem, co przyspieszyło sprawę.
źródło