在SQL中,数据类型转换是一个常见的操作,它允许将一种数据类型的值转换为另一种数据类型。这种转换可以是隐式的,也可以是显式的。隐式转换是数据库系统自动进行的,而显式转换则需要明确指定。本文将详细介绍这两种转换方式,以及如何使用CAST和CONVERT函数进行数据类型转换。
隐式数据类型转换发生在数据库系统自动将一种数据类型的值转换为另一种数据类型的情况。这种转换是可能的,但并不保证所有类型的值都能转换为另一种类型。例如,一个VARCHAR类型的值‘汽车坏了’不能隐式转换为DATETIME类型。隐式转换的一个例子是在处理百分比和INT数据类型时的乘法运算。
考虑以下SQL查询,它计算产品库存的总成本:
SELECT P.Name, I.Quantity, P.StandardCost, I.Quantity * P.StandardCost AS TotalCost
FROM Production.ProductInventory I
INNER JOIN Production.Product P
ON P.ProductID = I.ProductID
WHERE P.StandardCost > 0.00;
在这个查询中,Quantity是一个SMALLINT类型的值,没有小数位,而StandardCost是一个MONEY类型的值,有小数位。在计算TotalCost时,Quantity首先被转换为MONEY数据类型。
隐式转换的顺序由数据类型的优先级决定。数据类型优先级决定了隐式数据类型转换的方向或顺序。低优先级的数据类型会尝试转换为高优先级的数据类型,但不会反过来。例如:
SELECT 100 * .5;
这个语句返回50.0。原因是0.5的优先级更高,所以SQL将100(INT类型)转换为高优先级的数据类型。由于从100到100.00是允许的隐式转换,所以没有错误地发生。
并非总是可能在表达式中组合数据类型而不引起服务器错误。当这种情况发生时,需要显式地将一种数据类型转换为另一种数据类型以避免错误,这可以通过SQL转换函数CAST和CONVERT来实现。
例如,可能想要查询员工的生日并返回文本。如果尝试执行以下命令,它会失败:
SELECT P.FirstName + ' ' + P.LastName, 'Birth Date ' + E.BirthDate
FROM HumanResources.Employee E
INNER JOIN Person.Person P
ON P.BusinessEntityID = E.BusinessEntityID;
这个查询返回错误,因为BirthDate列的数据类型是DateTime。在这里,正在混合文本和日期。为了修复这个问题,首先需要将DateTime数据类型转换为文本值。
可以使用CAST语句将BirthDate转换为VARCHAR值。这个语句可以无错误地运行:
SELECT P.FirstName + ' ' + P.LastName, 'Birth Date ' + CAST(E.BirthDate AS VARCHAR)
FROM HumanResources.Employee E
INNER JOIN Person.Person P
ON P.BusinessEntityID = E.BusinessEntityID;
CAST SQL转换函数用于将一个值从一种数据类型转换为另一种数据类型。它是一个符合ANSI SQL-92标准的函数。函数的语法是:
CAST(value AS datatype)
其中value是要转换的项,datatype是希望转换为的类型。例如,在前一节的例子中,CAST(E.BirthDate AS VARCHAR)将DATETIME列BirthDate转换为VARCHAR文本值。
当从DATATYPE值转换为VARCHAR时,通常不使用CAST,因为通常希望格式化值;然而,当只需要进行转换时,会使用CAST。这发生在想要将VARCHAR或其他文本值转换为数值或DATETIME值进行计算时,或者需要将数值转换为相同类型,例如在处理INT和FLOAT值时。
CONVERT SQL转换函数用于将一个值从一种数据类型转换为另一种数据类型,并带有格式化。它是特定于SQL Server的,不符合ANSI SQL-92标准。函数的语法是:
CONVERT(datatype, value, style)
其中datatype是希望转换为的类型,value是要转换的项,style是希望看到转换值的格式。
CONVERT函数在想要以文本形式显示日期或数值时非常有用。将专注于转换日期。一旦掌握了这一点,那么转换数值就变得轻而易举了。
例如,以下SQL查询返回当前日期:
SELECT 'Today''s date is ' + CAST(GETDATE() AS varchar);
这个查询返回结果“Today’s date is Jul 4 2015 10:35AM”。有三件事需要注意:
那么,如何修复格式呢?可以使用CONVERT和样式。
检查以下SQL查询:
SELECT 'Today''s date is ' + CONVERT(VARCHAR, GETDATE(), 101);
这个查询返回结果“Today’s date is 07/04/2015”。好多了!
“101”在CONVERT中是样式。MSDN上列出了许多其他样式,但一些更受欢迎的用于日期的样式是:
注意:会注意到每个列表中有两个样式。这是为了让可以选择显示带有或不带有世纪的日期。单个数字样式将年份显示为两位数(yy);而那些在几百中的显示年份为四位数(yyyy)。
记住,convert的样式是可选的。