Иллюстрированный самоучитель по SQL для начинающих

Сложные выражения со значением

Еще одно специальное выражение CASE – COALESCE

COALESCE (объединять), как и NULLIF, является упрощенной формой специального выражения CASE. COALESCE работает со списками значений, которые могут быть как определенными, так и неопределенными. Если в списке только одно из значений не является NULL, то оно и становится значением выражения COALESCE. Если же в списке таких значений больше, чем одно, то значением выражения становится первое из них. Когда все значения списка – NULL, то значением выражения COALESCE также становится NULL.

Выражение CASE, выполняющее те же действия, имеет следующий вид:

CASE
WHEN значение 1 IS NOT NULL
THEN значение1
WHEN значение2 IS NOT NULL
THEN значение2
…
WHEN значение_n IS NOT NULL
THEN значение_n
ELSE NULL
END

А соответствующий упрощенный синтаксис COALESCE выглядит так:

COALESCE(значение1, значение2,…, значение_n)

Возможно, вам придется использовать выражение COALESCE после выполнения операции OUTER JOIN (о которой рассказывается в главе 10). Этот оператор позволяет сократить объем вводимого кода.

Преобразование типов данных с помощью выражения CAST

В главе 2 рассказывалось о различных типах данных, используемых при работе с SQL. В идеальном случае каждый столбец таблицы должен иметь подходящий тип. Однако в действительности не всегда ясно, каким же он должен быть. Предположим, определяя для базы данных таблицу, вы присваиваете столбцу тип данных, который замечательно подходит для вашего нынешнего приложения. Однако позднее вам, возможно, потребуется расширить поле деятельности вашего приложения или написать полностью новое приложение, в котором данные используются по-другому. Для этого нового использования может потребоваться тип данных, который отличается от выбранного вами ранее.

Возможно, вам потребуется сравнить столбец одного типа, находящийся в одной таблице, со столбцом другого типа из другой таблицы. Например, в одной таблице даты могут храниться в виде символьных данных, а в другой – в виде значений типа DATE. Даже если в обоих столбцах находятся одни и те же элементы данных, например даты, их разные типы могут не позволить сделать сравнение. Для SQL-86 и SQL-89 несовместимость типов данных представляет большую проблему. Однако с появлением SQL-92 появилось и удобное ее решение – выражение CAST (приведение).

Выражение CAST преобразует табличные данные или базовые переменные одного типа в другой. После такого преобразования можно выполнять необходимые операцию или анализ.

Используя выражение CAST, вы, естественно, столкнетесь с некоторыми ограничениями. Нельзя без разбора преобразовать данные одного типа в любой другой. Преобразуемые данные должны быть совместимы с новым типом. Например, можно использовать выражение CAST для преобразования в тип DATE символьной строки '1998-04-26', имеющей тип данных CHAR(IO). Однако символьную строку 'rhinoceros' (носорог), также имеющую тип данных CHAR(IO), преобразовывать с помощью CAST в тип DATE уже нельзя. Нельзя преобразовать значение типа INTEGER в значение типа SMALLINT, если размер первого из них превышает размер, максимально допустимый для SMALLINT.

Элемент данных любого из символьных типов можно преобразовать в любой другой тип (например, числовой или даты) при условии, что значение этого элемента имеет вид литерала нового типа. И наоборот, элемент данных любого типа можно преобразовать в любой из символьных типов в виде литерала исходного типа.

Другие возможные преобразования перечислены ниже.

  • Любой числовой тип – в любой другой числовой. При преобразовании в тип с меньшей дробной частью система округляет результат или отбрасывает в нем лишние цифры.
  • Любой точный числовой тип – в интервал, состоящий из одного компонента, такой, например, как INTERVAL DAY или INTERVAL SECOND.
  • Любой тип DATE – в TMESTAMP. В полученном значении типа TTMESTAMP та часть, которая предназначена для времени, будет заполнена нулями.
  • Любой тип TIME – в тип TIME с другой точностью дробной части или в TIMESTAMP. Часть, предназначенная для даты в TIMESTAMP, заполняется значением текущей даты.
  • Любой тип TIMESTAMP – в DATE, TIME или TIMESTAMP с другой точностью дробной части.
  • Любой тип INTERVAL года-месяца – в точный числовой тип или в INTERVAL года-месяца с другой точностью ведущего поля.
  • Любой тип INTERVAL дня-времени – в точный числовой тип или в INTERVAL дня-времени с другой точностью ведущего поля.
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.