我想知道这两个查询之间的语法更好:
SELECT MyField1
FROM MyTable
WHERE MyField2 <> 0 AND MyField2 <> 10
或:
SELECT MyField1
FROM MyTable
WHERE MyField2 NOT IN (0, 10)
修改:
相关问题:为什么我使用NOT IN (NULL, 0, 10)
我没有获得任何行?
答案 0 :(得分:1)
一般情况下尽量不要使用NOT IN
。这是我做了一段Don't Use Not In的写作。 不要使用除非你真的知道你的数据,否则你真的知道NOT IN变成丑陋。
在你非常狭隘的问题中,如果你不是专家,那么肯定,NOT IN是可行的方法。
问题通常不是(0,10),如op问题。这应该是我经常达到的我的武器库。而不是IN对我来说不是其中之一。使用null值非常危险,并且由于人们通常不知道他们的数据,使用该子句可能会浪费宝贵的时间。
有一天,我会偶然发现一个伟大的博客,有人写了这篇博客,描述了他和两个同事,所有非懒散的人,花了相当多的时间来研究他们的NOT IN查询失败的原因。
答案 1 :(得分:1)
使用MyField2 NOT IN (0, 10)
表现良好(优化者将能够找出最佳方法)并表达最佳意图(人类易于理解)。
为什么MyField2 NOT IN (0, 10, NULL)
不起作用?
在SQL中,与NULL
的任何平等比较都会产生NULL
,即x = NULL
会产生NULL
,这既不是true
也不是false
}。由于NOT IN (...)
需要与列表中的每个值进行比较,因此得到的(布尔)比较结果列表将包含NULL
。在确定所有比较是false
(即AND
所有布尔值)时,结果为NULL
,而不是true
,因此测试失败,无论什么正在测试价值。
答案 2 :(得分:0)
语义上两者都是平等的。潜在的性能差异应该是查询优化器的问题。所以这一切归结为哪个变体更能说明你的意图。