Спецификация типа данных

Функция

Определение оператора явного преобразования типов данных.

Спецификация

   
< спецификация типа >::=

Синтаксические правила

  1. < Значимое выражение > должно иметь числовой, дата-время, логический, байтовый или символьный тип данных языка SQL (возможно, с указанием длины, точности и масштаба) либо иметь NULL-значение.

  2. Если из контекста запроса невозможно определить тип данных NULL-значения < значимого выражения >, по умолчанию используется INTEGER.

    Сравните:

    • используется значение по умолчанию:

      select  NULL  from $$$USR where rowid  >2;
    • тип данных берется из контекста:

      select 'A'
       union
      select  NULL;
      |          A|
      |           |
    • явное указание типа данных:

      select 1, null
       union
      select null, cast null as char(10);
  3. < Значимое выражение > не должно быть < запросом выборки >.

  4. Каждое числовое выражение может быть явно преобразовано в любой другой допустимый числовой тип или в другую точность представления. Если результат преобразования (с возможным округлением) не попадает в диапазон значений типа результата, то выдается ошибка.

    select cast 5.7 as int, cast (2000+length(user))/76.6 as real ;
    |         5|     26.97128|
    
    select 5.78865366547895, cast 5.78865366547895 as decimal(11,5);
    |5.78865366547895 |5.78865 |

Общие правила

  1. Символьное выражение может быть преобразовано в любой числовой тип. При этом в результате символьного выражения отсекаются ведущие и концевые пробелы, а остальные символы преобразуются в числовое значение по правилам языка SQL. Невозможность преобразования диагностируется ошибкой.

    select cast '6754' as bigint, cast '6774.9' as double, cast '123'||'456' as bigint;
    |                6754|                6774.9|              123456|
  2. Если явно заданная длина символьного типа недостаточна, и преобразованное значение не помещается в нем, то значение усекается справа, и ошибка не выдается.

  3. Возможно явное преобразование символьного типа в символьный тип с другой длиной. Если длина результата больше длины аргумента, то значение дополняется пробелами; если меньше, то усекается. Сообщений об ошибках при этом не выдается.

    select cast model as char(30) as "Модель" from auto;
    select cast ' Модель ' as char(20)
     union
    select model from auto order by 1;

    Обеспечение совместимости типов при объединении запросов:

    select name from person
     union
    select cast null as char(20) from person;
  4. NULL-значение преобразуется в NULL-значение соответствующего типа.

  5. Числовое выражение может быть преобразовано в символьный тип. Если длина символьного типа не указана явно, то она устанавливается следующим образом:

    • для SMALLINT – 6 символов;

    • для INTEGER – 11 символов;

    • для BIGINT – 20 символов;

    • для REAL – 15 символов;

    • для DOUBLE – 7 символов;

    • для DECIMAL – 32 символа.

    select cast 567 as char(10);
  6. Поддерживаются следующие неявные преобразования типов:

    • преобразование NULL в любой тип данных;

    • для строковых типов – объединение элементов с разной длиной;

    • для констант – преобразования CHAR в VARCHAR, INTEGER в SMALLINT, INTEGER в BIGINT, DOUBLE в REAL, DECIMAL в DOUBLE, DECIMAL в REAL.

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

  7. При преобразовании логических выражений константные значения преобразуются сразу, например:

    cast(0 as boolean) - > FALSE
    cast(true as boolean) - > TRUE
    cast(true as integer) - > 1

    а неконстантные выражения – через выражение CASE, например:

    cast (b as integer) - > case b when false then 0 else 1 end
  8. Поддерживаются запросы типа:

    • SELECT CASE ... WHEN ... TNEN IS NULL ELSE < значение >;

    • SELECT CASE ... WHEN ... TNEN < значение > ELSE NULL;

    • SELECT NULL FROM ... UNION SELECT < значение > FROM ...;

    • SELECT < значение > FROM ... UNION SELECT NULL FROM ...;

    т.е. для них не надо явно писать CAST NULL AS.

  9. Если в UNION стоят значения одинакового типа (символьного), но разной длины, то происходит автоматическое приведение типа без явного задания оператора CAST.

  10. При операции UNION преобразование строковых констант типа VARCHAR в тип VARCHAR не выполняется.

  11. При преобразовании CAST CHAR AS VARCHAR дополнение пробелами VARCHAR не выполняется.

  12. При присвоении по команде INSERT (UPDATE) значения CAST AS < строковый тип > некоторому столбцу без явного указания длины строкового типа длина делается равной длине столбца.

  13. При обработке числовой константы, если не удалось ее преобразовать к типу DECIMAL, делается попытка преобразовать ее к типу DOUBLE.

  14. При преобразовании значений типа DATE в строковые и целые типы данных и обратно через конструкцию CAST используются стандартные форматы (см. функции TO_CHAR, TO_DATE и TO_NUMBER).

    select cast '28.04.2003' as date, cast sysdate as char(20);
    |28.04.2003:00:00:00.00 |10.04.2003:14:08:59.00 |
  15. Если аргумент агрегатной функции SUM имеет тип данных INTEGER, то при вычислении выражения типа CAST (SUM(< значимое выражение >) AS INTEGER) он не преобразуется в тип данных DECIMAL (сумма считается в целых числах). Это справедливо и для типов данных SMALLINT, BIGINT.