这两个SQL Server查询是否相同?

时间:2017-05-21 15:34:33

标签: sql sql-server

我已经写了两个查询来获取不以元音开头或不以元音结尾的列值。

查询1:

SELECT DISTINCT CITY
FROM STATION
WHERE city NOT LIKE '[aeiou]%'
   OR city NOT LIKE '%[aeiou]'

查询2:

SELECT DISTINCT CITY
FROM STATION
WHERE city NOT LIKE '[aeiou]%[aeiou]'

据我所知,他们应该是相同的查询,因为他们很容易通过测试用例并过滤相同的结果。这两种不同的查询在任何情况下都是吗?

4 个答案:

答案 0 :(得分:5)

不,他们的行为不同。我预计与Comparable等城市存在一些差异,因为长度为1的字符串与模式"a"不匹配,但可能与[aeiou]%[aeiou][aeiou]%都匹配。刚刚尝试过,实际上存在差异。人们仍然可以讨论哪两个查询正确解释%[aeiou],但至少两个查询的行为都不同:

'a'

结果:

SELECT *
  FROM (VALUES ('aasfa')
             , ('basda')
             , ('asdfb')
             , ('a')
       ) t1 (c)
       where c  not like '[aeiou]%[aeiou]';

查询:

c
-----
basda
asdfb
a

结果:

SELECT *
  FROM (VALUES ('aasfa')
             , ('basda')
             , ('asdfb')
             , ('a')
       ) t1 (c)
       where c    not  like '[aeiou]%'
or c not  like '%[aeiou]'

答案 1 :(得分:2)

不,他们不一样。应用de Morgan的规则可以看出:

!a or !b = !(a and b),

事件ab

提供
a = like '[aeiou]%'
b = like '%[aeiou]'.

此外,a and b对应于事件like '[aeiou]%[aeiou]',它基本上是包含所有事件ab的两个集合的集合交集。

编辑:上一句错误,它会对单元素字符串产生错误的结果。要查找集a and b,请考虑

a = { x | first element in {a,e,i,o,u} }
b = { x | last  element in {a,e,i,o,u} }

因此,

a AND b = { x | first AND last element in {a,e,i,o,u} }

现在,相比之下,like '[aeiou]%[aeiou]'a AND b的子集,在第一个和最后一个元素之间有另一个可选字符。

很抱歉这个混乱。

答案 2 :(得分:1)

这两个查询都会获取在其名称的开头或结尾处具有非元音的城市。它们应该返回相同的结果集。例如,“迈阿密”匹配两个查询。

但是,它们不是相同的。一个将执行基础like运算符两次,另一个执行一次。在这种情况下,性能差异可能不明显,但在其他情况下可能会有所不同。

如果您希望在名称的开头结尾处没有元音的城市,则:

WHERE city not  like '[aeiou]%' AND city not  like '%[aeiou]'

或:

WHERE city LIKE '[^aeiou]%[^aeiou]'

“迈阿密”与这些条件不符,但“波士顿”确实如此。

答案 3 :(得分:1)

没有。它们不一样。 以下是样本输入:xyz,axyz,xyza,axyza,a。

第一个查询将返回:xyz,axyz,xyza。在此' AND'应该用来获得所需的输出。下面的查询将仅返回xyz。

SELECT DISTINCT CITY
FROM STATION
WHERE city NOT LIKE '[aeiou]%'
   AND city NOT LIKE '%[aeiou]'

第二个查询将返回:xyz,axyz,xyza,a。这是因为条件

NOT LIKE '[aeiou]%[aeiou]'

表示它不应该以元音开头和结尾。因此,没有选择axyza而选择a,axyz和xyza,尽管它们不应该被选择。