在MS SQL Server中,有什么区别:
select * from Person where Id='7'
和
select * from Person where Id=7
两个查询返回相同的结果。
ID 类型为 int 。
我们不应该将int与string进行比较吗?
什么时候应该使用其中一个?
答案 0 :(得分:4)
始终与相同的数据类型进行比较,避免隐式转换。
SELECT 'Not OK!' WHERE 'text' = 1
-- Result: Conversion failed when converting the varchar value 'text' to data type int.
正如数据类型优先级所述,当数据类型不匹配时,SQL引擎将(在大多数情况下)尝试将最复杂的类型转换为最简单的类型,因此比较更快。在这种情况下(VARCHAR
与INT
),它总是将字符串类型转换为int。
此外,在对具有连接和其他操作的隐式转换的SQL进行编码时,最有可能生成与显式转换相同的执行计划。
如果你必须比较不同的类型,记得明确地转换它们,不仅仅是因为前面提到的原因,而且还向下一个开发人员说明列或表达式在数据类型上有所不同。
SELECT 'OK!' WHERE 'text' = CONVERT(VARCHAR(10), 1)
对于某些数据类型,如果您保留隐式转换,则可能会发现不需要的行为。
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)