Булев, спецтипы и приведение типов
Знакомимся с булевым типом, фирменными типами PostgreSQL и приведением одного типа к другому.
Приведение типа (cast) — это явное преобразование значения из одного типа в другой, например строки
'42'в число42.
Логический тип boolean
boolean хранит истину или ложь. PostgreSQL принимает много написаний на ввод (true/false, 't'/'f', 'yes'/'no', 1/0), но в выводе и логике это всегда true/false. Третье состояние — NULL (значение неизвестно).
CREATE TABLE tasks (
id INTEGER PRIMARY KEY,
name TEXT,
done INTEGER -- в песочнице SQLite булев эмулируем числом 0/1
);
INSERT INTO tasks (id, name, done) VALUES
(1, 'Купить молоко', 1),
(2, 'Помыть машину', 0),
(3, 'Позвонить врачу', 0);
SELECT name FROM tasks WHERE done = 0;
Вывод:
Помыть машину Позвонить врачу
В песочнице на SQLite отдельного типа boolean нет, поэтому здесь мы эмулируем его числом 0/1. В настоящем PostgreSQL столбец был бы done BOOLEAN, а условие — WHERE done = false.
Специальные типы PostgreSQL
Здесь PostgreSQL обгоняет многие СУБД. Эти типы редко встречаются «в базовом SQL», но в реальной работе незаменимы.
CREATE TABLE accounts (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY, -- глобально уникальный id
tags TEXT[], -- массив строк
settings JSONB -- документ JSON
);
INSERT INTO accounts (tags, settings) VALUES
(ARRAY['vip', 'beta'], '{"theme": "dark", "lang": "ru"}');
| Тип | Зачем |
uuid | глобально уникальный идентификатор, не зависит от счётчика |
text[] | массив значений прямо в одном столбце |
json / jsonb | хранение документов; jsonb — бинарный, индексируемый, быстрый |
Работе с JSONB и массивами посвящён отдельный материал в последнем разделе — там много операторов.
Приведение типов: CAST и ::
Иногда нужно превратить значение одного типа в другой: строку в число, число в текст, текст в дату. Для этого есть два равнозначных способа.
-- Стандартный синтаксис CAST(значение AS тип)
SELECT CAST('42' AS INTEGER) + 8 AS result;
Вывод:
result 50
Тот же смысл короче записывают через оператор :: — это уже PostgreSQL-специфика:
-- PostgreSQL-сокращение: значение::тип
SELECT '42'::int + 8; -- 50
SELECT 3.7::int; -- 3 (усечение, не округление)
SELECT now()::date; -- из timestamp оставить только дату
SELECT '2026-06-14'::date; -- строка -> дата
Оператор :: очень удобен и встречается в PostgreSQL-коде повсюду. Но помните: CAST(... AS ...) — стандартный SQL и работает везде, а :: — фирменное сокращение PostgreSQL.
Итог
booleanхранитtrue/false/NULL; в PG условие пишут какWHERE done = false.- Фирменные типы
uuid, массивыtext[]иjsonbрасширяют возможности далеко за «базовый SQL». - Приведение типов: стандартный
CAST(x AS тип)или PostgreSQL-сокращениеx::тип.