Страницы

Поиск по вопросам

понедельник, 24 сентября 2018 г.

Преобразование данных в SQL

Когда мы присваиваем значение одного одного типа столбцу, который хранит данные другого типа, либо выполняем операции, которые вовлекают данные разных типов, SQL Server пытается выполнить преобразование и привести используемое значение к нужному типу. Но не все преобразования SQL Server может выполнить автоматически. SQL Server может выполнять неявные преобразования от типа с меньшим приоритетом к типу с большим приоритетом. Таблица приоритетов (чем выше, тем больший приоритет):
datetime
smalldatetime
float
real
decimal
money
smallmoney
int
smallint
tinyint
bit
nvarchar
nchar
varchar
char
То есть SQL Server автоматически может преобразовать число 100.0 (float) в дату и время (datetime).
В тех случаях, когда необходимо выполнить преобразования от типов с высшим приоритетом к типам с низшим приоритетом, то надо выполнять явное приведение типов. Для этого в T-SQL определены две функции: CONVERT и CAST.
Функция CAST преобразует выражение одного типа к другому. Она имеет следующую форму:
1
CAST(выражение AS тип_данных)
Для примера возьмем следующие таблицы:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE TABLE Products
(
    Id INT IDENTITY PRIMARY KEY,
    ProductName NVARCHAR(30) NOT NULL,
    Manufacturer NVARCHAR(20) NOT NULL,
    ProductCount INT DEFAULT 0,
    Price MONEY NOT NULL
);
CREATE TABLE Customers
(
    Id INT IDENTITY PRIMARY KEY,
    FirstName NVARCHAR(30) NOT NULL
);
CREATE TABLE Orders
(
    Id INT IDENTITY PRIMARY KEY,
    ProductId INT NOT NULL REFERENCES Products(Id) ON DELETE CASCADE,
    CustomerId INT NOT NULL REFERENCES Customers(Id) ON DELETE CASCADE,
    CreatedAt DATE NOT NULL,
    ProductCount INT DEFAULT 1,
    Price MONEY NOT NULL
);
Например, при выводе информации о заказах преобразует числовое значение и дату в строку:
1
2
SELECT Id, CAST(CreatedAt AS nvarchar) + '; total: ' + CAST(Price * ProductCount AS nvarchar)
FROM Orders
Функция CAST в T-SQL и MS SQL Server

Convert

Большую часть преобразований охватывает функция CAST. Если же необходимо какое-то дополнительное форматирование, то можно использовать функцию CONVERT. Она имеет следующую форму:
1
CONVERT(тип_данных, выражение [, стиль])
Третий необязательный параметр задает стиль форматирования данных. Этот параметр представляет числовое значение, которое для разных типов данных имеет разную интерпретацию. Например, некоторые значения для форматирования дат и времени:
  • 0 или 100 - формат даты "Mon dd yyyy hh:miAM/PM" (значение по умолчанию)
  • 1 или 101 - формат даты "mm/dd/yyyy"
  • 3 или 103 - формат даты "dd/mm/yyyy"
  • 7 или 107 - формат даты "Mon dd, yyyy hh:miAM/PM"
  • 8 или 108 - формат даты "hh:mi:ss"
  • 10 или 110 - формат даты "mm-dd-yyyy"
  • 14 или 114 - формат даты "hh:mi:ss:mmmm" (24-часовой формат времени)
Некоторые значения для форматирования данных типа money в строку:
  • 0 - в дробной части числа остаются только две цифры (по умолчанию)
  • 1 - в дробной части числа остаются только две цифры, а для разделения разрядов применяется запятая
  • 2 - в дробной части числа остаются только четыре цифры

Например, выведем дату и стоимость заказов с форматированием:

1
2
3
SELECT CONVERT(nvarchar, CreatedAt, 3),
       CONVERT(nvarchar, Price * ProductCount, 1)
FROM Orders
Функция Convert в T-SQL и MS SQL Server

TRY_CONVERT

При использовании функций CAST и CONVERT SQL Server выбрасывает исключение, если данные нельзя привести к определенному типу. Например:
1
SELECT CONVERT(int, 'sql')
Чтобы избежать генерации исключения можно использовать функцию TRY_CONVERT. Ее использование аналогично функции CONVERT за тем исключением, что если выражение не удается преобразовать к нужному типу, то функция возвращает NULL:
1
2
SELECT TRY_CONVERT(int, 'sql')      -- NULL
SELECT TRY_CONVERT(int, '22')       -- 22

Дополнительные функции

Кроме CAST, CONVERT, TRY_CONVERT есть еще ряд функций, которые могут использоваться для преобразования в ряд типов:
  • STR(float [, length [,decimal]]): преобразует число в строку. Второй параметр указывает на длину строки, а третий - сколько знаков в дробной части числа надо оставлять
  • CHAR(int): преобразует числовой код ASCII в символ. Нередко используется для тех ситуаций, когда необходим символ, который нельзя ввести с клавиатуры
  • ASCII(char): преобразует символ в числовой код ASCII
  • NCHAR(int): преобразует числовой код UNICODE в символ
  • UNICODE(char): преобразует символ в числовой код UNICODE
1
2
3
4
5
SELECT STR(123.4567, 6,2)   -- 123.46
SELECT CHAR(219)            --  Ы
SELECT ASCII('Ы')           -- 219
SELECT NCHAR(1067)          -- Ы
SELECT UNICODE('Ы')     -- 1067

Комментариев нет:

Отправить комментарий