/WyrażeniaIWarunki

Z Brain-wiki

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.