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



Константы

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