Sql [col]in('single element')和[col]='single element'之间有什么区别吗?

Sql [col]in('single element')和[col]='single element'之间有什么区别吗?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在重构一个collegues的旧SQL代码,并注意到在“XYZ”中有一个where子句,形式为where[SomeCol]。我假设这只是从代码中的其他位置快速复制粘贴的结果,在括号中[SomeCol]位于'ABC'、'DEF'、'XYZ'中,并将其替换为[SomeCol]='XYZ',即使只是为了整洁 我只是想绝对确定这两个语句在功能上是相同的——我假设[SomeCol]='XYZ'有点可能更高效,但我不想稍后发现我被一些模糊的功能绊倒了,这些功能会产生不同的结果。它们在操作上应该是相同的。

我正在重构一个collegues的旧SQL代码,并注意到在“XYZ”中有一个where子句,形式为where[SomeCol]。我假设这只是从代码中的其他位置快速复制粘贴的结果,在括号中[SomeCol]位于'ABC'、'DEF'、'XYZ'中,并将其替换为[SomeCol]='XYZ',即使只是为了整洁


我只是想绝对确定这两个语句在功能上是相同的——我假设[SomeCol]='XYZ'有点可能更高效,但我不想稍后发现我被一些模糊的功能绊倒了,这些功能会产生不同的结果。

它们在操作上应该是相同的。我有时在开始时只有一个值,但怀疑将来可能需要其他值的情况下执行。这使得在不改变语句结构的情况下添加新值变得更容易。只是猜测一下原因。

它们在操作上应该是相同的。我有时在开始时只有一个值,但怀疑将来可能需要其他值的情况下执行。这使得在不改变语句结构的情况下添加新值变得更容易。只是猜测一下原因。

它们是等价的

对于in列表中小于63的值,SQL Server将in列表扩展为多个OR。比如说,

[SomeCol] IN (1,2,3,4) 
将被视为

([SomeCol]=1 or [SomeCol]=2 or [SomeCol]=3 or [SomeCol]=4)
因此,在这种情况下,没有OR,因此两者都是等效的。

它们是等效的

对于in列表中小于63的值,SQL Server将in列表扩展为多个OR。比如说,

[SomeCol] IN (1,2,3,4) 
将被视为

([SomeCol]=1 or [SomeCol]=2 or [SomeCol]=3 or [SomeCol]=4)

因此,在这种情况下,将不存在ORs,因此两者都是等效的。

看看执行计划。我举的例子是一样的,它们在各个方面都是等价的。结果没有差别,表现也没有差别。如果您检查执行计划,您将看到'XYZ'中的[SomeCol]执行为[SomeCol]='XYZ',因此更改它不会产生任何影响。@Kai。唯一的区别是可维护性。如果您可能正在添加和删除值,则表单中的值更安全。您不必担心有人将x='a'和y='c'更改为x='a'或x='b'和y='c'。看看执行计划。我举的例子是一样的,它们在各个方面都是等价的。结果没有差别,表现也没有差别。如果您检查执行计划,您将看到'XYZ'中的[SomeCol]执行为[SomeCol]='XYZ',因此更改它不会产生任何影响。@Kai。唯一的区别是可维护性。如果您可能正在添加和删除值,则表单中的值更安全。你不必担心有人把x='a'和y='c'改成x='a'或x='b'和y='c'。你还记得从哪里得到这些信息吗?我对有关MSSQL查询优化器内部工作原理的文章非常感兴趣,因此如果它是公共资源,请共享链接:-@PaulGroke-我不确定它是否在任何地方被记录。但是很明显,如果你拼错了SomeCol,就会发生类似的事情——在这个过程中,每个元素都会收到一条错误消息IN@Damien_The_Unbeliever-我很确定这是解析器的人工制品,并且没有说任何关于查询优化器会对查询做什么的事情,如果它曾经看到过的话。我也想知道你从哪里得到63位数-根据Damien_异教者的评论,刚刚尝试了一个有数百个值的故意错误的in列表,从错误列表中没有证据表明行为改变超过这个数字。只检查了2个执行计划-一个带有20个元素的in查询,一个带有200个元素。无论长度如何,这两个词似乎都被看作是一系列的或语句。你能回忆起你从哪里得到这些信息吗?我对有关MSSQL查询优化器内部工作原理的文章非常感兴趣,因此如果它是公共资源,请共享链接:-@PaulGroke-我不确定它是否在任何地方被记录。但是很明显,如果你拼错了SomeCol,就会发生类似的事情——在这个过程中,每个元素都会收到一条错误消息IN@Damien_The_Unbeliever-我很确定这是解析器的人工制品,并且没有说任何关于查询优化器会对查询做什么的事情,如果它曾经看到过的话。我也想知道你从哪里得到63位数-根据Damien_异教者的评论,刚刚尝试了一个有数百个值的故意错误的in列表,从错误列表中没有证据表明行为改变超过这个数字。只检查了2个执行计划-一个带有20个元素的in查询,一个带有200个元素。无论长度如何,这两种语言似乎都被看作是一系列OR语句。