2013-07-24 75 views
1

我重構一個的同事老SQL代碼,並在一些地方發現一個地方的形式where [SomeCol] in ('XYZ')的條款。我假定這只是在括號(where [SomeCol] in ('ABC', 'DEF', 'XYZ'))與多個值代碼等地快速複製粘貼的結果,並與[SomeCol] = 'XYZ',只爲整潔起見替換他們,即使。('single element')和[col] ='single element'中的[col]有什麼區別?

只是想絕對確定這兩個語句在功能上是否相同 - 我認爲[SomeCol] = 'XYZ'有點(可能不太可能)更有效率,但不想在以後找出我正在絆倒一些模糊功能會產生不同的結果。

+1

看看執行計劃。對於我的例子來說,它是一回事。 – makciook

+1

它們在各方面都是相同的。結果沒有差異,也沒有差異。如果你檢查執行計劃,你會發現你的''SomeCol''被執行爲'[SomeCol] ='XYZ'',所以你不會因爲改變它而有所作爲。 –

+2

@凱。 。 。唯一的區別是可維護性。如果你可能會添加和刪除值,那麼'in'形式更安全。您不必擔心有人將'x ='a'和y ='c''更改爲'x ='a'或x ='b'和y ='c''。 –

回答

3

他們應該是相同的操作性。我有時在開始時有一個單一的價值,但未來可能需要其他價值。這樣可以更輕鬆地添加新值,而無需更改語句的結構。只是猜測「爲什麼」。

1

他們是等價的。

對於小於IN列表中的63個值時,SQL Server擴展IN列表到多個手術室。例如,

[SomeCol] IN (1,2,3,4) 

將在此情況下,可以作爲evaulated

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

因此,就沒有OR值,因此兩者是相同的。

+2

你有任何改變回憶你從哪裏得到這些信息?我會在對MSSQL查詢優化器的內部工作原理的文章很感興趣,所以如果它是一個公共源,請分享:-) –

+0

@PaulGroke鏈接 - 我不知道它的任何地方記錄。但是很顯然,如果你拼錯'SomeCol',那麼類似的事情就會發生 - 你會在'IN'中的每個元素得到一個錯誤消息。 –

+0

@Damien_The_Unbeliever - 我很確定這是解析器的一個人造物,並沒有說什麼查詢優化器對查詢做了什麼,如果它會看到它的話。 –

相關問題