Самоучитель по SQL-сервер в Linux



Преобразование типов

В PostgreSQL поддерживаются три отдельных варианта синтаксиса преобразования (приведения) типов, то есть механизма приведения данных от одного типа к другому. В команде SQL преобразование типов позволяет явно задать тип создаваемой константы (вместо его косвенного определения по правилам языка).

В общем случае приведение строковой константы к другому типу может выполняться любым из трех способов:

тип 'значение'

'значение': -.тип

CAST ('значение' AS тип)

Числовые константы преобразуются в символьную строку следующими способами:

значение: : тип

CAST (значение AS тип)

Здесь значение представляет константу, тип которой требуется изменить, а тип — новый тип этой константы.

ПРИМЕЧАНИЕ

Помните, что тип money считается устаревшим, что несколко затрудняет его использование в преобразованиях.

Преобразование к другому типу данных не ограничивается одними константами. Поля набора данных, возвращаемого запросом SQL, также могут преобразовываться к другому типу, при этом используются следующие формы синтаксиса:

идентификатор:: тип

CAST (идентификатор AS тип)

Следует учесть, что не каждый тип данных может быть приведен к любому другому типу. Например, не существует осмысленного преобразования символьной строки abed в двоичную последовательность типа bit. Недопустимые попытки преобразования приводят к ошибкам PostgreSQL. Чаще всего встречаются преобразования символьных строк, типов даты/времени или числовых типов к типу text, а также символьных строк в числа.

Кроме синтаксических форм преобразования типа существуют некоторые функции, позволяющие добиться практически того же результата. Имена этих функций часто совпадают с именами итоговых типов (например, text()), хотя существуют и узкоспециализированные варианты (например, bitfromint4()). В листинге 3.30 приведен пример использования функции text О для преобразования целого числа 1000 в строку типа text, содержащую символы «1000».

Листинг 3.30. Использование функции преобразования типа

booktown=# SELECT text(1000)

booktown-# AS explicitjtext;

explicit_text