Bazy danych – PostgreSQL – Praktyczne zastosowanie koercji typów

Koercja typów

PostgreSQL obsługuje trzy różne konwencje koercji typów (nazywane również rzutowaniem typów lub jawnym rzutowaniem typów). Współbieżność typów jest nieco brzydko wyglądającym terminem, który odnosi się do metody PostgreSQL umożliwiającej zmianę wartości z jednego typu danych na inny. W środku instrukcji SQL powoduje to efekt netto w postaci jawnego utworzenia stałej dowolnego typu.

Generalnie każda z poniższych trzech metod może być użyta w celu rzutowania wartości zawartej w stałej łańcuchowej na inny typ:

  • type 'value ’

  • ’value ’::type

  • CAST (’value 'AS type )

W przypadku utrzymywanych stałych numerycznych, które chcesz rzutować na łańcuch znaków, będziesz musiał użyć jednej z poniższych form składniowych:

  • value ::type

  • CAST (value AS type )

Wartość w tej składni reprezentuje stałą, której typ danych chcemy zmodyfikować,a typ reprezentuje typ, na który chcemy wymusić, czyli rzutować, wartość.

Uwaga: Pamiętaj, że typ money jest zdeprecjonowany, a zatem nie jest łatwo rzutowany.

Stałe nie są jedynymi wartościami danych, które mogą być wymuszone do różnych typów. Kolumny zbioru danych zwracane przez zapytanie SQL mogą być rzutowane przy użyciu ich identyfikatora w jednej z następujących form składni:

  • identyfikator ::typ

  • CAST (identifier AS type )

Należy pamiętać, że nie każdy typ danych może być rzutowany na każdy inny typ danych. Na przykład, nie ma sensownego sposobu, aby przekonwertować ciąg znaków abcd na binarny typ bitowy. Nieprawidłowe rzutowanie spowoduje wystąpienie błędu w PostgreSQL. Typowe poprawne rzutowania to: z łańcucha znaków, typu daty/czasu lub typu numerycznego na tekst lub z łańcucha znaków na wartości numeryczne.

Oprócz tych konwencji rzutowania istnieją pewne funkcje, które mogą być wywołane w celu osiągnięcia tego samego efektu, co rzutowanie jawne dowolnej z wcześniej wymienionych form. Często noszą one nazwę samego typu (np. funkcja text()), choć inne są nazwane bardziej szczegółowo (np. bitfromint4()). Przykład 3-30 pokazuje taką funkcję, konwertującą liczbę całkowitą 1000 na łańcuch znaków o typie text, reprezentujący znaki 1000.

Przykład 3-30. Użycie funkcji konwersji typu

booktown=# SELECT text(1000) booktown-# AS explicit_text; explicit_text--------------- 1000(1 row)

Z powodu sprzecznych semantyk rozpoznawanych przez parser PostgreSQL, format koercji typu 'wartość’ może być użyty tylko do określenia typu danych pojedynczej wartości (np. stała łańcuchowa ujęta w cudzysłów). W przeciwieństwie do tego, inne dostępne metody wymuszania typów (’value ’::type,CAST(’value’ AS type )i funkcje konwersji typów, gdzie ma to zastosowanie) mogą być użyte do określenia typu arbitralnych wyrażeń.

Dzieje się tak częściowo dlatego, że próba podążania za typem danych za pomocą zgrupowanego wyrażenia (np, w nawiasach) spowoduje, że PostgreSQL będzie oczekiwał funkcji o nazwie podanego typu danych (co często spowoduje błąd), podczas gdy każda z pozostałych metod jest poprawna składniowo w przypadku wyrażeń zgrupowanych.

booktown=# SELECT 1 + integer ('1' || '2') AS add_one_to_twelve;ERROR: Function 'integer(text)' does not exist Unable to identify a function that satisfies the given argument types You may need to add explicit typecastsbooktown=# SELECT 1 + ('1' || '2')::integer AS add_one_to_twelve; add_one_to_twelve------------------- 13(1 row)booktown=# SELECT 1 + CAST('1' || '2' AS integer) AS add_on_to_twelve; add_on_to_twelve------------------ 13(1 row)

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.