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?
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.
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-- ,EFROMTABLEWHERE1=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 "ifuser chooses option a then this +="and A is not null "ifuser chooses option b then this +="and B is not null "ifuser chooses option b then this +="and C is not null "ifuser 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.
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;)
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.
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ą.
code
podobnie 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).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ę.
źródło
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
where
parametr: 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 dostarczaliwhere 1=1
klauzulę. Teoretycznie wydaje się to nierozsądne, praktycznie wszystkie optymalizatory zapytań wykluczają tego typu instrukcje. I trudno jest edukować 10 000 osób.źródło
WHERE 1=1; DROP TABLE CUSTOMERS
?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ą.
źródło
Proszę bardzo ... z punktu widzenia programowania jedno użycie 1 = 1 ...
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”
Ułatw sobie
źródło