/WyrażeniaIWarunki
Spis treści
TI:WTBD/WyrażeniaIWarunki
Wyrażenia występują m. in. jako definicje kolumn zbioru wynikowego i w budowie warunków tworzących klauzule WHERE takich instrukcji, jak DELETE czy UPDATE. Są budowane ze stałych, operatorów, odniesień do kolumn tabel źródłowych, i wywołań funkcji.
Wyrażenia arytmetyczne
Liczby literalne (stałe) dziesiętne, całkowite i zmiennoprzecinkowe, zapisuje się standardowo Do dyspozycji są na pewno cztery działania oraz operator reszty z dzielenia (%), zazwyczaj też operatory bitowe ( >> << & | ). Poza tym, repertuar dostępnych funkcji matematycznych zależy od produktu. W SQLite do dyspozycji jest standardowo bardzo niewiele (funkcje ABS, ROUND, MAX(A, B, ..) i MIN(A, B, ..)), dla odmiany w MySQL dostępny jest dość kompletny repertuar funkcji matematycznych.
Wyrażenia napisowe
- Literalne napisy muszą być odgraniczone apostrofami ('Napis'). Apostrof wewnątrz napisu reprezentowany jest przez apostrof podwojony.
- Operator sklejania (konkatenacji) pisze się || (dwie kreski pionowe).
- Jest wiele funkcji operujących na napisach, np.:
- LENGTH(A)
- LOWER(A)
- LTRIM(A[, B])
- REPLACE(A, B, C) -- zastąp każde wystąpienie B w A przez C
- RTRIM(A[, B])
- SUBSTR(A, B[, C]) -- część napisu A od pozycji B o długości C; B i C mogą być ujemne, pozycje znaków są liczone od 1
- TRIM(A[, B])
- UPPER(A)
- W konkretnym produkcie takich funkcji może być więcej
Warunki
Warunki występują przede wszystkim w klauzulach WHERE. Tworzone są za pomocą porównań.
- Operator porównania zapisuje się pojedynczym znakiem równości (=), stosuje się on zarówno do liczb jak i do napisów
- Operatory nierówności ( < > <= >= != ) również mogą być stosowane do napisów (oprócz oczywistego zastosowania do wartości liczbowych). Reguły porządkowania napisów (i związane z nimi reguły porównywania) mogą być nieoczywiste, gdy napisy wykraczają poza ASCII.
- Zapis A BETWEEN B AND C jest równoważny (A >= B AND A <= C)
- Porównanie czegokolwiek z NULL zazwyczaj daje wartość NULL (podobnie jak inne operatory, gdy NULL jest jednym z argumentów). Wyjątkiem są operatory IS oraz IS NOT. Warunek sprawdzający, czy X jest NULL, należy więc pisać: X IS NULL, nie: X=NULL
- W porównywaniu napisów przydatny jest operator LIKE:
- A LIKE wzorzec
- wzorzec konstruuje się z udziałem znaków specjalnych % (dowolny ciąg) i _ (dowolny 1 znak). Wiele produktów bazodanowych umożliwia korzystanie z wyrażen regularnych, np. MySQL: wprowadzając odrębny operator REGEXP (albo RLIKE). W SQLite to standardowo nie działa.
- Z warunków prostych można budować warunki złożone za pomocą operatorów logicznych: AND, OR, NOT
- Standard SQL nie przewiduje wartości logicznych, jak True i False w Pythonie. Dlatego nie można np. zdefiniować kolumny tabeli jako zawierającej logiczną flagę -- zamiast tego stosuje się wartości 0 i 1, albo symbole jednoliterowe w rodzaju T i N. W wielu systemach jednak warunki są de facto traktowane jak wyrażenia o wartościach numerycznych 0 i 1, i można np. użyć ich jako elementu wyrażeń arytmetycznych -- i odwrotnie, wyrażeń arytmetycznych jako warunków atomowych (niezerowa wartość odpowiada prawdzie); np. MySQL i SQLite to dopuszczają. Inne produkty jednak podchodzą do tego bardziej rygorystycznie i nie pozwalają na takie mieszanie wyrażeń i warunków (np. Oracle).
- Logika w SQL jest w istocie trójwartościowa: wartość wyrażenia logicznego może być NULL. Efektywnie jednak warunek o wartości NULL działa jak fałszywy.
Wyrażenia warunkowe
- CASE x WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END
- CASE WHEN x=w1 THEN r1 WHEN x=w2 THEN r2 ELSE r3 END
- Oba wyrażenia powyżej są równoważne, z dokładnością do tego, że pierwsze daje gwarancję tylko jednokrotnej ewaluacji wyrażenia x
- Oczywiście w drugiej postaci w klauzulach WHEN mogą występować bardziej złożone warunki, a samych klauzul WHEN może być więcej (lub mniej)
- Klauzula ELSE jest opcjonalna. Jeśli żadna gałąź nie zostanie wybrana, a klauzuli ELSE nie ma, wynikiem jest NULL.
- Nieco podobny charakter ma funkcja COALESCE(A, B, ..), która zwraca pierwszy w kolejności argument, który nie jest NULL.