![]() |
![]() |
![]() |
Константы При работе с базами данных многие объекты хранятся на диске, а для обращения к ним используются идентификаторы (имена таблиц, полей и функций). Однако неизбежно настанет момент, когда в систему потребуется передать новые данные — например, при вставке новых записей, при формировании секций с критериями удаления или модификации или при вычислениях на базе существующих записей. Такие данные передаются в виде констант, также иногда называемых «литералами». Константы предназначены для «буквального» представления данных в командах 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 в стиле С
ВНИМАНИЕ Вследствие того что обратная косая черта имеет особый смысл (см. табл. 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. Представление величин с плавающей точкой
В первом формате до десятичной точки и после нее должна стоять хотя бы одна цифра. Это необходимо для того, чтобы модуль лексического анализа 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 не сможет правильно интерпретировать их, что приведет к ошибке. |
![]() |
![]() |
![]() |