Po co używać WHERE 1 lub WHERE 1 = 1?


50

Zwykle, jeśli warunki nie są wymagane w naszych instrukcjach zapytań, nie używamy WHEREklauzuli. Ale widzę WHERE 1klauzulę stosowaną w wielu miejscach, nawet tam, gdzie nie występują inne warunki.

  • Dlaczego to się dzieje?
  • Czy są jakieś szczególne korzyści z czasu realizacji?
  • Czy umożliwia inne funkcjonalności?
  • Czy używanie WHERE 1=1jest podobne do tego?

Odpowiedzi:


42

Zasadniczo jest to tylko dla wygody programisty, ponieważ możesz po prostu dodać dodatkowe warunki AND...i nie ma to wpływu na czas wykonywania.

Sprawdź poniższe linki do Stackoverflow:

Zauważ, że WHERE 1jest identyczny z WHERE 1=1; oba oznaczają, WHERE TRUEale te pierwsze są odrzucane przez wiele systemów zarządzania bazami danych, ponieważ nie są tak naprawdę boolowskie.


15

Moje główne zastosowanie polega na tym, że ułatwia komentowanie rzeczy podczas tworzenia zapytań. Prowadzę za pomocą ,„i and”:

SELECT
     A
--  ,B
    ,C
    ,D
--  ,E
FROM TABLE
WHERE 1=1
--  and B='This'
    and C='That'
--  and D is not null

Ułatwia także programowe przypinanie rzeczy do końca.

this  = "SELECT * "
this += "FROM TABLE "
this += "WHERE 1=1 "
if user chooses option a then this += "and A is not null "
if user chooses option b then this += "and B is not null "
if user chooses option b then this += "and C is not null "
if user chooses option b then this += "and D is not null "

W przeciwnym razie musisz zakwalifikować pierwszą opcję ... i każda następna opcja sprawdzi poprzednie opcje. Co jeśli użytkownik wybrał opcję D tylko w poprzednim przykładzie? Musisz się upewnić, że if A, B and C aren't chosennastępnie użyj WHEREinnego użycia and. Ze =na początku, można po prostu uderzyć w kwalifikacjach do końca zestawienia.


1
I napisałeś ten kod jak 1980 w języku bez orientacji obiektowej, zanim ktokolwiek wpadł na pomysł generatora sql opartego na obiektach?
TomTom

Piszę codepodobnie do pierwszego bloku w SSMS lub podobnych narzędziach do zapytań. Badanie zestawów danych i uzyskiwanie właściwych wyników przed wprowadzeniem ich do narzędzi raportowania (takich jak Crystal Reports) dla użytkowników końcowych. Drugi blok jest tym, co widziałem inni ludzie, ponieważ moja praca nie była zbytnio związana z dostępem do surowego sql. Mam problem z innym kodem podobnym do ludzi i rozumiem jego rozumowanie. (Kod był w VB, C # i PHP).
WernerCD

10

Dlaczego to robimy?

Przychodzi mi na myśl dynamiczne generowanie kodu napisane przez niezbyt kompetentnych programistów.

Generuje WYBIERZ .... GDZIE, a następnie musisz mieć COŚ .... więc zamiast dodawać GDZIE tylko w razie potrzeby, dodają nieograniczający warunek, gdy go nie ma. Widziałem to - odpowiedzialny za zwolnienie „specjalisty”.

Albo facet po prostu rzeczy GDZIE jest obowiązkowe;)

Czegokolwiek jeszcze nie widzę.


5

Programowałem kilka funkcji zdefiniowanych przez użytkownika w C ++ / C dla PostgreSQL, z których korzystali inni ludzie w dużej firmie (ponad 10 000 osób). Moje funkcje mają opcjonalny whereparametr: jeśli nie podano żadnej wartości, klauzula nie była używana. Zostało to wyraźnie udokumentowane. Niestety nikt nie korzystał z tej funkcji i wszyscy tylko dostarczali where 1=1klauzulę. Teoretycznie wydaje się to nierozsądne, praktycznie wszystkie optymalizatory zapytań wykluczają tego typu instrukcje. I trudno jest edukować 10 000 osób.


3
Nikt nigdy nie dzwonił do twojego UDF WHERE 1=1; DROP TABLE CUSTOMERS?
Twinkles,

Nadal nie jestem w stanie znaleźć pojęć za pomocą klauzuli Where 1. Potrzebujesz więcej wyjaśnień? Ponieważ nie uzyskałem żadnej poprawy czasu realizacji.
ursitesion

To ma niewiele do zrobienia z czasem wykonania. Ma to związek z kulturą programowania ludzi. Czasami zdarza się, że Twój kod (programowany przez informatyków) jest używany przez inżynierów. Ci faceci mają swój sposób myślenia i wywoływania twojego kodu
Arthur

@Twinkles: to zdecydowanie interesujący problem. Warto zwrócić uwagę na kilka punktów. (i) baza danych jest tylko do odczytu dla UDF (ii) Moja funkcja dołącza do kilku grup tabel przez kilka rzeczy i, co gorsza, używa funkcji okienkowania hurtowni danych. To sprawia, że ​​rzucanie czegokolwiek jest trudne, (choć nie jest to niemożliwe) (iii) UDF są przeznaczone do kodu przedprodukcyjnego. Co oznacza, że ​​nigdy nie wejdzie do produkcji: jeśli funkcja przetrwa wyzwanie, inny dział całkowicie przepisuje wszystko, co zaprogramowaliśmy
Arthur

4
W rzeczywistości dość łatwo jest wykształcić 10 000 osób. Spraw, aby aplikacja nie działała, gdy zrobią to źle. Natychmiast przestaną robić to źle.
Jasmine

2

Użycie „where 1 = 1” zmniejsza złożoność kodu potrzebnego w dynamicznym tworzeniu klauzul SQL „where”. W przeciwnym razie podczas tworzenia klauzuli „gdzie” należy sprawdzić, czy jest to pierwszy składnik dla każdego dodanego składnika. Jest to prosty wzorzec kodu, aby zmniejszyć złożoność kodu i, w miarę możliwości, zmniejszyć złożoność kodu, jest prawie zawsze właściwą decyzją.


0

Proszę bardzo ... z punktu widzenia programowania jedno użycie 1 = 1 ...wprowadź opis zdjęcia tutaj

W takiej sytuacji, gdy muszę skonstruować zapytanie w czasie wykonywania, które może być krótkie lub długie, używam „gdzie 1 = 1 ORAZ”

string criteria =string.Empty;
        if (txtc1.Text != "")
        {
            criteria += "criteria1=" + "'" + txtc1.Text + "' ";
        }
        if (txtc2.Text != "")
        {
            criteria += "OR criteria2=" + "'" + txtc2.Text + "' ";
        }
        if (ddl1.SelectedItem.Text != "")
        {
            criteria += "OR criteria3=" + "'" + ddl1.SelectedItem.Text + "' ";
        } if (ddl2.SelectedItem.Text != "")
        {
            criteria += "OR criteria4=" + "'" + ddl2.SelectedItem.Text + "' ";
        }
        if (ddl3.SelectedItem.Text != "")
        {
            criteria += "OR criteria5=" + "'" + ddl3.SelectedItem.Text + "' ";
        }
        if (ddl4.SelectedItem.Text != "")
        {
            criteria += "OR criteria6=" + "'" + ddl4.SelectedItem.Text + "' ";

        } 
        if (txtc1.Text == "")  
        {
            //criteria = criteria.Substring(2);
            criteria = criteria.Substring(2,criteria.Length-3);
        }
        if (criteria != string.Empty)
        {
            criteria = "where 1=1 AND " + criteria;
            //Response.Write("<script>alert('query constructed by you is : '+'" +criteria+ "');</script>");
            Response.Write(criteria);
        }

Ułatw sobie

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.