Иллюстрированный самоучитель по PostgreSQL

Типы данных

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

Листинг 3.18. Выборка данных по логическому признаку.

booktown=# SELECT * FROM dailyjnventory WHERE in_stock='yes':
isbn in_stock
0385121679 | t
039480001X | t
044100590X t
0441172717 I t
(4 rows)

В PostgreSQL предусмотрена возможность неявной выборки по значению true в логическом поле; для этого имя поля указывается без операторов или ключевых слов-модификаторов. В хорошо спроектированных таблицах такой подход помогает создавать более наглядные запросы. Пример приведен в листинге 3.19.

Листинг 3.19. Неявная выборка по логическому значению.

true booktown=# SELECT * FROM dailyjnventory WHERE in_stock;
isbn | in_stock
0385121679 | t
039480001X | t
044100590X | t
0441172717 | t
(4 rows)

Хотя в этом запросе не указана конкретная логическая величина, при отсутствии оператора сравнения подразумевается значение true.

Для выборки по значению false можно либо сравнить значение поля с любой из логических констант, перечисленных в табл. 3.11, либо поставить перед именем поля ключевое слово SQL NOT. Оба способа продемонстрированы в листинге 3.20.

Листинг 3.20. Выборка по логическому значению false.

booktown=# SELECT * FROM dailyjnventory WHERE in_stock = 'no';
isbn | in_stock
0451198492 f 0394900014 f (2 rows)
booktown=# SELECT * FROM dailyjnventory
WHERE NOT in_stock:
isbn | in_stock
0451198492 | f
0394900014 | f
(2 rows)

Этот пример убедительно доказывает, что при проектировании языка SQL учитывался фактор наглядности и удобочитаемости программ. При грамотном выборе имен таблиц и полей запрос почти не отличается от обычной фразы на английском языке.

Сравнение значений логических полей с константами из табл. 3.11 может осуществляться при помощи оператора неравенства != (например, WHERE in_stock!='t'). Таким образом, следующие три синтаксические формы эквивалентны:

SELECT * FROM daily_iinventory
WHERE NOT injtock: SELECT * FROM
dailyjnventory WHERE in_stock = 'no1:
SELECT * FROM dailyjnventory WHERE in_stock!= 't':

Возможно, вы обратили внимание на то, что в листинге 3.17 в таблицу вставляется семь записей, а суммарное количество записей при двух выборках (для поля i n_stock, равного true и false) только шесть. Дело в том, что в последней операции вставки в листинге 3.17 значение поля i n_stock не указано, поэтому в записи книги с кодом ISBN равным 0451160916 поле in_stock равно NULL.

Как упоминалось выше, величина NULL не интерпретируется как true или false, поэтому для выборки по значению NULL необходимо использовать условие IS NULL. Также можно воспользоваться оператором !=, но тогда возникают проблемы с адаптацией программы для других СУБД. Пример запроса SQL с условием IS NULL:

booktown=# SELECT * FROM
dailyjnventory WHERE in_stock IS NULL:
isbn | 1n_stock
0451160916 |
(1 row)

Поскольку IS NULL является обычным условием SQL, для обновления всех случайных значений NULL в поле in_stock можно воспользоваться командой UPDATE, приведенной в листинге 3.21.

Листинг 3.21. Исправление случайных значений NULL.

booktown=# UPDATE dailyjnventory
SET in_stock = Т WHERE in_stock IS NULL;
UPDATE 1
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.