Data: 17.12.2025

Łączenie warunków filtrowania i wzorce w PostgreSQL
Spis treści
- Łączenie warunków filtrowania i wzorce w PostgreSQL
- Łączenie warunków filtrowania i wzorce w PostgreSQL
- Operatory logiczne AND i OR – jak łączyć wiele warunków w jednym zapytaniu?
- Operatory
INiNOT IN– filtrowanie wielu wartości - Operatory
BETWEENiNOT BETWEEN– filtrowanie zakresów - Operatory
LIKEiNOT LIKE– podstawowe wyszukiwanie wzorców - Operatory
ILIKEiNOT ILIKE– wyszukiwanie bez rozróżniania wielkości liter - Zestawienie operatorów
W tym poradniku pokażę Ci, jak wykorzystać łączenie warunków filtrowania i wzorce w PostgreSQL, aby uprościć kod i wyszukiwać fragmenty tekstu.
Łączenie warunków filtrowania i wzorce w PostgreSQL
W poprzednim artykule Wybieranie kolumn i filtrowanie wierszy w PostgreSQL opisywaliśmy, w jaki sposób wybierać kolumny i w prosty sposób filtrować wiersze przy użyciu znaków równości, mniejszości i większości oraz jak stronicować wyniki zapytań.
Jednak pracując z bazami danych rzadko szukamy tylko jednej konkretnej wartości. Częściej musimy odpowiadać na pytania w stylu: „Pokaż klientów, którzy kupili produkt X LUB Y” albo „Znajdź wszystkich pracowników, których nazwisko zaczyna się na literę K”.
Aby realizować takie zadania, niezbędne jest poprawne łączenie warunków filtrowania i wzorce w PostgreSQL.
W tym artykule pokażę Ci, jak używać operatorów AND i OR oraz filtrować dane przy użyciu IN, BETWEEN, a także jak stosować LIKE i ILIKE.
Operatory logiczne AND i OR – jak łączyć wiele warunków w jednym zapytaniu?
Operatory logiczne AND i OR służą do budowania złożonych zapytań. Możemy ich używać np. w klauzuli WHERE, za pomocą której filtrujemy rekordy z tabeli.
Operator AND (I) w PostgreSQL
Operatora AND używamy, gdy zależy nam na zawężeniu wyników wyszukiwania. Aby dany rekord pojawił się w wynikach zapytania, musi on spełniać jednocześnie wszystkie warunki połączone tym operatorem. Jeśli chociaż jeden z warunków nie jest zgodny z prawdą (nie jest spełniony), wiersz nie zostanie uwzględniony w wyniku zapytania.
W przykładzie szukamy pracowników, którzy pracują w biurze w Londynie na stanowisku przedstawiciela handlowego (Sales Representative).
Kolumna City musi zawierać wartość „London” i kolumna Title zawierać wartość „Sales Representative”, aby rekord trafił do wyniku zapytania.
SELECT First_Name, Last_Name, Title, CityFROM EmployeesWHERE City = 'London' AND Title = 'Sales Representative';
W tabeli przedstawiam logikę trójwartościową dla operatora AND (koniunkcji) stosowaną w języku SQL.
Zasady działania:
- wynik jest prawdziwy (TRUE) tylko wtedy, gdy obydwie strony wyrażenia są prawdziwe
- jeśli chociaż jeden argument jest fałszywy (FALSE), wynik zawsze będzie fałszywy
- UNKNOWN w połączeniu z prawdą pozostaje nieznany, gdyż brakująca (nieznana) wartość mogłaby się okazać fałszem
| AND | TRUE | FALSE | UNKNOWN |
|---|---|---|---|
| TRUE | TRUE | FALSE | UNKNOWN |
| FALSE | FALSE | FALSE | FALSE |
| UNKNOWN | UNKNOWN | FALSE | UNKNOWN |
Operator OR (LUB) w PostgreSQL
Operator OR działa na zasadzie alternatywy. Aby dany rekord został uwzględniony w wyniku zapytania, wystarczy, że spełni on przynajmniej jeden z podanych warunków.
W wyniku poniższego zapytania otrzymamy listę firm, które mają siedzibę w Niemczech, a także tych, które mają siedzibę we Francji.
Kolumna Country musi zawierać wartość „Germany” lub „France”, aby rekord trafił do wyniku zapytania.
SELECT Company_Name, City, CountryFROM SuppliersWHERE Country = 'Germany' OR Country = 'France';Poniższa tabela przedstawia logikę trójwartościową dla operatora OR (alternatywy).
Zasady działania:
- jeśli chociaż jeden argument jest prawdziwy, wynik zawsze będzie TRUE nawet jeśli drugi to UNKNOWN
- wynik jest FALSE tylko wtedy, gdy obydwie strony wyrażenia są fałszywe
- UNKNOWN pojawia się wtedy, gdy nie mamy pewności co do wyniku np. FALSE OR UNKNOWN daje UNKNOWN, gdyż gdyby nieznana wartość okazała się prawdą, wynik byłby prawdziwy
| OR | TRUE | FALSE | UNKNOWN |
|---|---|---|---|
| TRUE | TRUE | TRUE | TRUE |
| FALSE | TRUE | FALSE | UNKNOWN |
| UNKNOWN | TRUE | UNKNOWN | UNKNOWN |
Łączenie AND i OR – uwaga na priorytety
Podczas łączenia operatorów logicznych AND i OR kluczowe znaczenie ma ich priorytet wykonania. Operator AND ma wyższy priorytet niż OR, co oznacza, że jest wykonywany jako pierwszy.
W poniższym przykładzie w wyniku otrzymamy wszystkich pracowników z Seattle, niezależnie od ich stanowiska oraz tylko tych pracowników z Londynu, którzy pracują na stanowisku Sales Representative.
SELECT First_name, Last_name, City, TitleFROM employeesWHERE City = 'Seattle'OR City = 'London' AND Title = 'Sales Representative'
W poniższym przykładzie kolejność wykonywania warunków określamy za pomocą nawiasów.
- za pomocą operatora
ORsprawdzamy, czy pracownik jest przypisany do biura w Seattle lub w Londynie - operator
ANDłączy wynik poprzedniego warunku z wymogiem, aby stanowisko pracownika (Title) było równe „Sales Representative” - w wyniku otrzymujemy pracowników z Seatle lub Londynu pracujących na stanowisku „Sales Representative”
SELECT First_name, Last_name, City, TitleFROM employeesWHERE (City = 'Seattle' OR City = 'London')AND Title = 'Sales Representative'
Operatory IN i NOT IN – filtrowanie wielu wartości
Operatory IN i NOT IN służą do filtrowania danych na podstawie listy wielu wartości.
Operator IN sprawdza, czy dana kolumna zawiera jedną z wartości wskazanych na liście.
Poniższe zapytanie zwraca pracowników, którzy pracują w Seattle lub w Londynie.
SELECT First_name, Last_name, City, TitleFROM employeesWHERE City IN ('Seattle', 'London');Operator NOT IN pozwala wykluczyć określone wartości z wyników zapytania. W poniższym zapytaniu otrzymamy pracowników, który nie pracują w Seattle i Londynie.
SELECT First_name, Last_name, City, TitleFROM employeesWHERE City NOT IN ('Seattle', 'London');Operator NOT IN a wartość specjalna NULL
Zapytanie z NOT IN i wartością specjalną NULL w warunku zwraca pusty wynik, gdyż SQL tłumaczy operator NOT IN na serię warunków połączonych operatorem AND.
W przykładzie poniżej sprawdzamy, czy ID pracownika jest różne od 3 i różne od 5 i różne od NULL.
Przykładowo dla rekordu o ID nr 1 sprawdzamy:
- czy ID 1 jest różne od 3 – wynik PRAWDA (TRUE) i
- czy ID 1 jest różne od 5 – wynik PRAWDA (TRUE) i
- czy ID 1 jest różne od wartości specjalnej NULL – wynik nie wiadomo (UNKNOWN). Wynik jest nieznany, gdyż nie jest znana wartość, która mogłaby być pod NULL
W przypadku operatora AND wszystkie warunki muszą być spełnione (dla każdego musimy otrzymać w wyniku PRAWDA), aby rekord trafił do wyniku zapytania. W wyniku otrzymamy zbiór pusty, gdyż przy sprawdzaniu, czy ID danego rekordu jest różne od NULL, otrzymujemy wynik UNKNOWN.
SELECT *FROM EmployeesWHERE EmployeeID NOT IN (3,5,NULL);Operatory BETWEEN i NOT BETWEEN – filtrowanie zakresów
Operatory BETWEEN i NOT BETWEEN służą do filtrowania danych na podstawie określonego zakresu wartości.
Operator BETWEEN sprawdza, czy dana wartość mieści się pomiędzy dwoma granicami, włącznie z wartościami brzegowymi zakresu. Obejmuje on zarówno dolną, jak i górną granicę zakresu.
SELECT Order_ID, Order_date, FreightFROM OrdersWHERE Order_date BETWEEN '1996-07-04' AND '1996-07-08';
Operator NOT BETWEEN wybiera wartości, które nie mieszczą się w podanym zakresie. W przykładzie wybrane zostaną wszystkie rekordy, w przypadku których data zamówienia (Order_date) jest mniejsza niż 1996-07-09 lub większa niż 1998-05-05.
SELECT Order_ID, Order_date, FreightFROM OrdersWHERE Order_date NOT BETWEEN '1996-07-09' AND '1998-05-05';Operatory LIKE i NOT LIKE – podstawowe wyszukiwanie wzorców
W pracy z bazami danych często potrzebujemy odnaleźć dane tekstowe nie według pełnej wartości, lecz według określonego wzorca. W SQL służy do tego operator LIKE.
W PostgreSQL operatory LIKE i NOT LIKE są wrażliwe na wielkość liter (case-sensitive).
Symbole wieloznaczne w LIKE:
- procent (%) – zastępuje dowolny ciąg znaków (0 lub więcej znaków)
- podkreślenie (_) – zastępuje dokładnie jeden dowolny znak
W przykładzie poniżej wybieramy te rekordy, w przypadku których nazwisko klienta zaczyna się na wielką literę „M”.
SELECT Contact_NameFROM CustomersWHERE Contact_Name LIKE 'M%';W kolejnym przykładzie wybieramy te rekordy, w przypadku których nazwisko klienta kończy się na małą literę „m”.
SELECT Contact_NameFROM CustomersWHERE Contact_Name LIKE '%m';Operator NOT LIKE pozwala wykluczać dane pasujące do określonego wzorca. W przykładzie poniżej wybieramy te rekordy, w przypadku których nazwisko klienta nie zaczyna się na wielką literę „M”.
SELECT Contact_NameFROM CustomersWHERE Contact_Name NOT LIKE 'M%';Operatory ILIKE i NOT ILIKE – wyszukiwanie bez rozróżniania wielkości liter
Czasami chcemy zignorować wielkość liter. W PostgreSQL służą do tego operatory ILIKE i NOT ILIKE.
W przykładzie poniżej znajdziemy nazwiska, które zaczynają się na „m” lub „M” (wielkość litery nie ma znaczenia).
SELECT Contact_NameFROM CustomersWHERE Contact_Name ILIKE 'm%';W przykładzie poniżej znajdziemy nazwiska, które nie zaczynają się na „m” lub „M” (wielkość litery nie ma znaczenia).
SELECT Contact_NameFROM CustomersWHERE Contact_Name NOT ILIKE 'm%';Zestawienie operatorów
Poniższa tabela zawiera zestawienie prezentowanych w artykule operatorów.
| Operator | Opis |
|---|---|
AND | łączy warunki i zwraca rekordy spełniające wszystkie kryteria jednocześnie |
OR | łączy warunki i zwraca rekordy spełniające dowolne z podanych kryteriów |
IN | sprawdza, czy wartość znajduje się na podanej liście wartości |
NOT IN | sprawdza, czy wartość nie znajduje się na podanej liście wartości |
BETWEEN | filtruje wartości mieszczące się w podanym zakresie (włącznie z granicami) |
NOT BETWEEN | filtruje wartości, które nie znajdują się w podanym zakresie |
LIKE | wyszukuje wzorce tekstowe (używając % i _). Rozróżnia wielkość liter |
NOT LIKE | sprawdza, czy wartość nie pasuje do wzorca tekstowego. Rozróżnia wielkość liter |
ILIKE | wyszukuje wzorce tekstowe ignorując wielkość liter |
NOT ILIKE | sprawdza, czy wartość nie pasuje do wzorca tekstowego, ignorując wielkość liter |
Jeśli czujesz, że chcesz lepiej opanować łączenie warunków filtrowania i wzorce w PostgreSQL oraz poznać więcej praktycznych przykładów, serdecznie zapraszamy Cię na nasz kurs PostgreSQL poziom podstawowy.
