Документация FirebirdДокументация по FirebirdFirebird 1.5 Быстрый старт → Firebird SQL
Firebird home Firebird home Пред.: Устанавливаем только клиентаНачало: Документация FirebirdУровень выше: Firebird 1.5 Быстрый стартСлед.: Резервируем

Firebird SQL

Разделительный символ строк
Идентификаторы в двойных кавычках
Апострофы в строках
Конкатенация строк
Деление целых чисел
NULL в выражениях

Каждая систем управления базами данных имеет свои отличительные особенности в реализации SQL. По сравнению с любой другой СУБД, за возможным исключением «близкой родственницы» - InterBase®, Firebird наиболее строгим образом соответствует стандарту SQL. Разработчики, переходящие с других продуктов, соответствующих стандарту в меньшей степени, ошибочно воспринимают Firebird странным, притом, что многие мнимые «странности» на самом деле не являются таковыми.

Разделительный символ строк

В Firebird строки отделяются парными символами одинарных кавычек – 'Замечательная строка' – (ASCII код - 39, не 96). Если Вы использовали предыдущие версии предшественницы Firebird, InterBase®, Вы можете вспомнить, что там символы одинарных и двойных кавычек использовались одновременно как разделители строк. В Firebird двойные кавычки не могут использоваться в качестве разделителей строк в SQL выражениях.

Идентификаторы в двойных кавычках

До выхода стандарта SQL-92, не допускалось использовать в качестве имен объектов (идентификаторов) ключевые слова, не учитывался регистр букв и не допускались пробельные символы. Стандарт SQL-92 сделал всё это возможным, определив, что идентификаторы должны определяться в парных двойных кавычках (ASCII код - 34) и при использовании также должны выделяться парными кавычками.

Смысл этого «подарка» заключался в упрощении процесса миграции метаданных из нестандартных СУБД в совместимые со стандартом. Обратная сторона медали заключается в том, что если Вы решаете использовать идентификаторы в двойных кавычках, их чувствительность к регистру и заключение их в двойные кавычки становятся обязательными.

При выполнении ограниченного набора условий, Firebird предлагает определенное послабление. Если идентификатор, определенный в двойных кавычках:

  1. был определен в верхнем регистре,

  2. не совпадает с ключевым словом,

  3. и не содержит пробелов,

...тогда он может использоваться в SQL-выражениях без кавычек и учета регистра символов. (Однако, если Вы заключаете идентификатор в кавычки, Вы должны снова учитывать регистр символов!)

Внимание

Не перемудрите с этим делом! Например, если у Вас есть таблицы "TESTTABLE" и "TestTable", определенные в двойных кавычках , и Вы выполняете запрос вида:

SQL>select * from TestTable;

...в результате Вы получите записи из таблицы "TESTTABLE", а не "TestTable"!

Обычно, рекомендуется, в случае отсутствия убедительных причин, избегать использования двойных кавычек при определении идентификаторов. К счастью, Firebird позволяет одновременно использовать идентификаторы в кавычках и без них – поэтому не бывает проблем в случае необходимости использования ключевых слов в качестве идентификаторов в унаследованных базах данных.

Внимание

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

Апострофы в строках

Если Вам необходимо использовать в строке символ апострофа, Вы можете «экранировать» (escape) его, предварив его другим апострофом.

Например, следующая строка приведет к ошибке:

'Joe's Emporium'

потому, что анализатор проинтерпретирует текст как строку 'Joe', за которой следуют какие-то неизвестные ключевые слова.

Чтобы сделать строку правильной, необходимо добавить второй апостроф:

'Joe''s Emporium'

Обратите внимание на то, что это ДВА символа одинарной кавычки, но не одна двойная кавычка.

Конкатенация строк

В SQL для конкатенации строк используются два символа «трубы» (ASCII 124, в паре без пробела между ними). При этом «+» является символом арифметического сложения, соответственно, при попытке его использования для объединения строк, вы получите сообщение об ошибке. Следующее выражение дополняет значения столбца фразой «Reported by: »:

'Reported by: ' || LastName

Будьте внимательны с конкатенацией и учтите, что Firebird выдаст сообщение об ошибке при попытке соединения значений двух или более столбцов типа char или varchar, чья суммарная потенциальная длина превышает предельный размер для строковых типов (32 Kb).

Кроме этого обратите внимание на нижеизложенный раздел NULL в выражениях.

Деление целых чисел

В соответствии со стандартом SQL, Firebird при вычислении частного от деления целого числа на целое округляет результат до ближайшего меньшего целого. В случае если Вы не были готовы, это может слегка шокировать Вас при получении результатов.

Например, следующее вычисление является корректным с точки зрения SQL:

1 / 3 = 0

Если Вы переходите с СУБД, в которой частное от деления целого на другое целое приводится к нецелому, Вам будет необходимо доработать подобные выражения и заменить тип делимого, делителя или обоих на число с плавающей или фиксированной точкой.

Например, предыдущий пример, для получения результата отличного от нуля, можно изменить следующим образом:

1.000 / 3 = 0.333

NULL в выражениях

В SQL, NULL - это не значение. Это условие, или состояние, элемента данных, в котором его значение не известно, в связи с этим NULL не может выступать в качестве значения. Если NULL участвует в арифметических или других выражениях, результат всегда будет NULL. Это не нуль, не пустота (пробел) или «пустая строка» и NULL не ведет себя как одно из этих значений.

Приведем некоторые, возможно «удивительные» для Вас, примеры вычислений и сравнений с участием NULL:

  • 1 + 2 + 3 + NULL = NULL

  • not (NULL) = NULL

  • 'Home ' || 'sweet ' || NULL = NULL

  • if (a = b) then
      MyVariable = 'Equal';
    else
      MyVariable = 'Not equal';

    Если и a и b - NULL - то после выполнения данного кода, значение MyVariable будет 'Not equal' (не равны). Потому что результат вычисления выражения 'a = b' будет NULL, если хотя бы один из операндов будет NULL. Соответственно, в контексте этого «if...then», NULL ведет себя как FALSE, блок 'then' пропускается и выполняется блок 'else'.

  • if (a <> b) then
      MyVariable = 'Not equal';
    else
      MyVariable = 'Equal';

    В этом примере, MyVariable будет иметь значение 'Equal'(равны), если a - NULL, а b - нет, или наоборот. Объяснение аналогично предыдущему случаю.

  • FirstName || ' ' || LastName

    в результате даст NULL, если хотя бы FirstName или LastName - NULL.

Подсказка

Воспринимайте NULL как НЕИЗВЕСТНО и ощущения странности результатов пропадут! Если значение Number не известно, то результат '1 + 2 + 3 + Number' так же получается не известным (и поэтому NULL). Если содержимое MyString не известно, тогда не известен результат конкатенации 'MyString || YourString' (даже если YourString не-NULL) и т.д.

Пред.: Устанавливаем только клиентаНачало: Документация FirebirdУровень выше: Firebird 1.5 Быстрый стартСлед.: Резервируем
Документация FirebirdДокументация по FirebirdFirebird 1.5 Быстрый старт → Firebird SQL