MS SQL Server比较数字列与字符串值

Hus*_*dan 5 sql sql-server

在MS SQL Server中,有什么区别:

select * from Person where Id='7'
Run Code Online (Sandbox Code Playgroud)

select * from Person where Id=7
Run Code Online (Sandbox Code Playgroud)

这两个查询返回相同的结果。

标识类型是INT

我们不应该将int与string进行比较吗?

什么时候应该使用其中之一?

EzL*_*zLo 5

始终将相同的数据类型进行比较,并避免隐式转换。

SELECT 'Not OK!' WHERE 'text' = 1
-- Result: Conversion failed when converting the varchar value 'text' to data type int.
Run Code Online (Sandbox Code Playgroud)

如数据类型优先级所述,当数据类型不匹配时,SQL引擎(在大多数情况下)将尝试将最复杂的类型转换为最简单的类型,因此比较会更快。在这种情况下(VARCHARvs. INT),它将始终将字符串类型转换为int。

另外,在对具有通过联接和其他操作进行隐式转换的SQL进行编码时,最有可能生成与通过显式转换生成的执行计划不同的执行计划。

如果必须比较不同的类型,请记住要显式地强制转换它们,这不仅是因为前面提到的原因,而且还告诉下一个开发人员数据类型不同的列或表达式。

SELECT 'OK!' WHERE 'text' = CONVERT(VARCHAR(10), 1)
Run Code Online (Sandbox Code Playgroud)

对于某些数据类型,如果您保留隐式转换,则可能会发现不需要的行为。

DECLARE @BitValue1 BIT = NULL
DECLARE @BitValue2 BIT = 1

SELECT
    'Oops!'
WHERE
    ISNULL(@BitValue1, -999) = ISNULL(@BitValue2, -999)

-- Result: Oops! (-999 is being converted to bit, which is 1)
Run Code Online (Sandbox Code Playgroud)