Data: 17.12.2025

Łączenie warunków filtrowania i wzorce w PostgreSQL

Łączenie warunków filtrowania i wzorce w PostgreSQL

Spis treści

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 ANDOR oraz filtrować dane przy użyciu IN, BETWEEN, a także jak stosować LIKEILIKE.

Operatory logiczne AND i OR – jak łączyć wiele warunków w jednym zapytaniu?

Operatory logiczne ANDOR 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, City
FROM Employees
WHERE City = 'London'
AND Title = 'Sales Representative';

Title

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
ANDTRUEFALSEUNKNOWN
TRUETRUEFALSEUNKNOWN
FALSEFALSEFALSEFALSE
UNKNOWNUNKNOWNFALSEUNKNOWN

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, Country
FROM Suppliers
WHERE 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
ORTRUEFALSEUNKNOWN
TRUETRUETRUETRUE
FALSETRUEFALSEUNKNOWN
UNKNOWNTRUEUNKNOWNUNKNOWN

Łączenie ANDOR – uwaga na priorytety

Podczas łączenia operatorów logicznych ANDOR 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, Title
FROM employees
WHERE City = 'Seattle'
OR City = 'London' AND Title = 'Sales Representative'

Title

W poniższym przykładzie kolejność wykonywania warunków określamy za pomocą nawiasów.

  • za pomocą operatora OR sprawdzamy, 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, Title
FROM employees
WHERE (City = 'Seattle' OR City = 'London')
AND Title = 'Sales Representative'

Title

Operatory INNOT IN – filtrowanie wielu wartości

Operatory INNOT 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, Title
FROM employees
WHERE 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, Title
FROM employees
WHERE 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 Employees
WHERE EmployeeID NOT IN (3,5,NULL);

Operatory BETWEENNOT BETWEEN – filtrowanie zakresów

Operatory BETWEENNOT 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, Freight
FROM Orders
WHERE Order_date BETWEEN '1996-07-04' AND '1996-07-08';

Title

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, Freight
FROM Orders
WHERE Order_date NOT BETWEEN '1996-07-09' AND '1998-05-05';

Operatory LIKENOT 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 LIKENOT 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_Name
FROM Customers
WHERE 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_Name
FROM Customers
WHERE 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_Name
FROM Customers
WHERE Contact_Name NOT LIKE 'M%';

Operatory ILIKENOT ILIKE – wyszukiwanie bez rozróżniania wielkości liter

Czasami chcemy zignorować wielkość liter. W PostgreSQL służą do tego operatory ILIKENOT ILIKE.

W przykładzie poniżej znajdziemy nazwiska, które zaczynają się na „m” lub „M” (wielkość litery nie ma znaczenia).

SELECT Contact_Name
FROM Customers
WHERE 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_Name
FROM Customers
WHERE Contact_Name NOT ILIKE 'm%';

Zestawienie operatorów

Poniższa tabela zawiera zestawienie prezentowanych w artykule operatorów.

OperatorOpis
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
INsprawdza, czy wartość znajduje się na podanej liście wartości
NOT INsprawdza, czy wartość nie znajduje się na podanej liście wartości
BETWEENfiltruje wartości mieszczące się w podanym zakresie (włącznie z granicami)
NOT BETWEENfiltruje wartości, które nie znajdują się w podanym zakresie
LIKEwyszukuje wzorce tekstowe (używając % i _). Rozróżnia wielkość liter
NOT LIKEsprawdza, czy wartość nie pasuje do wzorca tekstowego. Rozróżnia wielkość liter
ILIKEwyszukuje wzorce tekstowe ignorując wielkość liter
NOT ILIKEsprawdza, 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.

Paula Gajewska
Paula Gajewska
Programistka Python, SQL
Udostępnij wpis:udostępnij Facebookudostępnij Linkedinudostępnij e-mail

Polecane