Константы
При работе с базами данных многие объекты хранятся на диске, а для обращения к ним используются идентификаторы (имена таблиц, полей и функций). Однако неизбежно настанет момент, когда в систему потребуется передать новые данные — например, при вставке новых записей, при формировании секций с критериями удаления или модификации или при вычислениях на базе существующих записей. Такие данные передаются в виде констант, также иногда называемых «литералами». Константы предназначены для «буквального» представления данных в командах SQL (вместо ссылки на них по идентификатору).
Константы с косвенной типизацией автоматически распознаются модулем лексического разбора PostgreSQL по их синтаксису. В PostgreSQL поддерживаются пять вариатнов констант с косвенной типизацией:
- строковые константы;
- битовые последовательности;
- целочисленные константы;
- вещественные константы;
- логические константы.
Строковые константы
Строковая константа представляет собой произвольную последовательность символов, заключенную в апострофы. Строковые константы часто используются при вставке новых данных в таблицу и при передаче символьной информации другим
объектам базы данных. Ниже приведен пример использования строковых констант при обновлении имен и фамилий таблицы authors базы данных booktown:
booktown=# SELECT * FROM authors;
id | lastjiame | firstjiame
1809 Geisel | Theodor Seuss
1111 | Denham | Ariel
15990 | Bourgeois | Paulette
25041 | Bianco | Margery Williams
16 | Alcott I Luoisa May
115 | Рое | Edgar Allen
(6 rows)
Из результатов запроса видно, что поле firstjiame с кодом id=16, Louisa May, было ошибочно записано в виде Luoi sa May. Ошибка исправляется командой UPDATE со строковой константой, приведенной в листинге 3.4.
Листинг 3.4. Использование строковых констант
booktown=# UPDATE authors
booktown-# SET firstjiame = 'Louisa May'
booktown-l WHERE firstjiame = 'Luoisa May'
UPDATE 1
booktown-# SELECT * FROM authors;
id | lastjiame | firstjiame
1809 | Geisel | Theodor Seuss
1111 | Denham | Ariel 15990 | Bourgeois | Paulette
25041 | Bianco j Margery Williams
115 I Poe I Edgar Allen
16 j Alcott I Louisa May
(6 rows)
Команда UPDATE в листинге 3.4 использует строковые константы Louisa May и Luoisa May в сочетании с ключевыми словами SET и WHERE. Как видно из результатов запроса, команда обновляет содержимое таблицы, заданной идентификатором authors, и исправляет опечатку.
Тот факт, что строковые константы заключаются между апострофами, порождает очевидную семантическую проблему: если в самой последовательности символов встречается апостроф, граница строковой константы будет определена неверно. Чтобы экранировать апостроф в строке (то есть обеспечить его интерпретацию как литерала), следует поставить два апострофа подряд. Модуль лексического анализа воспринимает удвоенный апостроф в строковой константе как один апостроф-литерал. PostgreSQL также позволяет экранировать апострофы обратной косой чертой, в стиле языка С:
testdb=# SELECT 'PostgreSQL"s great!' AS example;
example
PostgreSQL's great! (1 row)
booktown=# SELECT 'PostgreSQLN's
С-style slashes are great!' AS example;
example
PostgreSQL's C-style slashes are great!
(1 row)
В PostgreSQL также поддерживаются служебные последовательности языка С, перечисленные в табл. 3.3.
Таблица 3.3. Служебные последовательности PostareSQL в стиле С
Последовательность | Описание |
\\ |
Обратная косая черта (литерал) |
V |
Апостроф (литерал) |
\Ь |
Забой |
\f |
Подача листа |
\п |
Новая строка |
\г |
Возврат курсора |
\t |
Табуляция |
\ххх |
ASCII-символ с восьмеричным кодом ххх |
ВНИМАНИЕ
Вследствие того что обратная косая черта имеет особый смысл (см. табл. 3.3), при включении в строку этот символ обязательно экранируется другой косой чертой (например, в строке 'A single backslash is: \\' двойной символ обратной косой черты преобразуется в один).
Если две строковые константы PostgreSQL разделены промежутком, в который входит хотя бы один символ новой строки, они объединяются в одну строковую константу. Пример приведен в листинге 3.5.
Листинг 3.5. Разбиение строковых констант
booktown=# SELECT 'book'
booktown-#
booktown-# 'end' AS example;
example
bookend (1 row)
booktown=# SELECT 'bookend' AS example;
example
bookend
(1 row)
Обе команды имеют эквивалентную семантику. Тем не менее фрагменты должны разделяться хотя бы одним разрывом строки, а при попытке разделить их только пробелами PostgreSQL выдает сообщение об ошибке:
booktown=# SELECT 'book' 'end' AS example;
ERROR: parser: parse error at or near .....
Дело в том, что без разрыва строки PostgreSQL считает, что вы ссылаетесь на две отдельные константы. Объединение двух строковых констант в одной строке выполняется оператором конкатенации 11, описанным в главе 5:
booktown=# SELECT 'book.' || 'end1 AS example; example
bookend (1 row)
Битовые последовательности
Битовые последовательности предназначены для представления двоичных величин в виде произвольной последовательности нулей и единиц. Как и строковые константы, битовые последовательности заключаются в апострофы, но начинаются с обязательного префикса В (в верхнем или нижнем регистре). По наличию этого символа PostgreSQL определяет, что строка является битовой последовательностью, а не обычной символьной строкой.
В соответствии с синтаксисом PostgreSQL открывающий апостроф должен следовать сразу же после префикса В, а битовая последовательность не может содержать других символов, кроме 0 и 1. Внутренние пробелы в битовых последовательностях запрещены, но допускается их разбиение по аналогии с обычными строковыми константами (см. выше пункт «Строковые константы).
Битовые строки обычно требуются только при работе с двоичными функциями и таблицами, содержащими двоичные данные. В листинге 3.6 продемонстрирована вставка битовой последовательности в таблицу. Сначала двоичное представление байта сохраняется в таблице my_bytes, а затем результат операции проверяется простым запросом.
Листинг 3.6. Использование битовых последовательностей
testdiH* INSERT INTO my_bytes VALUES (B'OOOOOOOO'):
testdb=# SELECT my_byte FROM my_bytes:
my_byte
10000000
10000001
10000101
11111111
00000000
(5 rows)
Целочисленные константы
Целочисленные константы используются гораздо чаще, чем битовые последовательности. В PostgreSQL целочисленной константой считается любая лексема, состоящая из цифр (без десятичной точки) и не заключенная в апострофы. Интервал допустимых значений целочисленных констант зависит в основном от контекста, но в PostgreSQL по умолчанию целочисленный тип представляется четырьмя байтами и принимает значения из интервала от -2 147 483 648 до 2 147 483 647.
Целочисленные константы часто встречаются в математических операциях, а также в командах SQL, содержащих ссылки на поля целочисленного типа. В листинге 3.7 целочисленные константы используются для обновления кода автора командой UPDATE.
Вспомните таблицу authors, которая устанавливает соответствие между числовым кодом автора и двумя строками, представляющими его имя и фамилию. Допустим, из каких-то административных соображений было решено, что все коды авторов, меньшие 100, нужно увеличить до 100 и выше.
Внесение исправлений начинается с поиска записей, у которых поле id удовлетворяет данному условию. Для этого в команду SELECT включается секция WHERE с целочисленной константой, используемой при проверке условия «меньше».
Листинг 3.7. Использование целочисленных констант
booktown=# SELECT * FROM
authors WHERE id < 100;
id | lastjiame | firstjiame
16 | Alcott | Louisa May (1 row)
booktown=# SELECT * FROM authors WHERE id = 100:
id | lastjiame | firstjiame
(0 rows)
booktown=# UPDATE authors
booktown-* SET id = 116
booktown-tf WHERE id = 16:
UPDATE 1
booktown=# SELECT * FROM authors WHERE id = 116:
id | last_name firstjiame
116 | Alcott | Louisa May (1 row)
В листинге 3.7 секция WHERE команды SELECT сравнивает идентификатор поля id с целочисленной константой 100. Результат состоит из одной записи. После обнаружения записи с недопустимым значением id вводится вторая команда SELECT, которая проверяет, существуют ли в таблице записи с кодом i d=116. Мы убеждаемся в том, что код 116 не задействован в таблице authors, поскольку значения в поле id должны быть уникальными. Операция завершается командой UPDATE, также содержащей целочисленные константы в секциях SET и WHERE.
Вещественные константы
Вещественные константы обладают определенным сходством с целочисленными константами, но используются для представления не только целых, но и дробных величин.
Существует несколько форматов представления вещественных констант, представленных в табл. 3.4. Запись ## означает одну или несколько цифр.
Таблица 3.4. Представление величин с плавающей точкой
Представление | Пример |
##.## | 6.4 |
##e[+-]## | 8е-8 |
[##].##[e[+-]##] | .04e8 |
##.[##][e[+-]##] | 4e.5 |
В первом формате до десятичной точки и после нее должна стоять хотя бы одна цифра. Это необходимо для того, чтобы модуль лексического анализа PostgreSQL опознал значение как вещественную, а не целочисленную константу. В других форматах хотя бы одна цифра должна стоять до или после экспоненты, обозначенной буквой е. Наличие десятичной точки и/или экспоненты отличает вещественные константы от целочисленных.
В листинге 3.8 использование всех вещественных форматов продемонстрировано на примере простой команды SQL SELECT.
Листинг 3.8. Допустимые вещественные значения
booktown=# SELECT .04 AS small_float.
booktown-# -16.63 AS negative_float,
booktown-# 4e3 AS exponent!al_float,
booktown-# 6.1e2 AS negative_exponent:
small_float | negative_float |
exponential__float | negative_exponent
0.04 -16.63 4000 | 0.061
(1 row)
Логические константы
Логические (булевы) константы гораздо проще всех остальных типов констант PostgreSQL, поскольку они принимают всего два допустимых значения: true и false. Встретив любое из этих значений, не заключенное в апострофы, PostgreSQL интерпретирует его как логическую константу. Пример показан в листинге 3.9.
Листинг 3.9. Различия между true и 'true'
testdb=# SELECT true AS boolean_t. testdb-# 'true' AS string_t,
testdb-# false AS boolean_f,
testdb-# 'false' AS string_f;
boo1_t | string_t | bool_f | string_f
t | true | f | false
(1 row)
Как показано в листинге 3.9, PostgreSQL выводит значения логического типа в виде t или f, однако это вовсе не означает, что символы t и f могут использоваться в качестве логических констант. PostgreSQL не сможет правильно интерпретировать их, что приведет к ошибке.
Назад | Содержание | Вперед |