我已经写了两个查询来获取不以元音开头或不以元音结尾的列值。
查询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]'
据我所知,他们应该是相同的查询,因为他们很容易通过测试用例并过滤相同的结果。这两种不同的查询在任何情况下都是吗?
答案 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)
!a or !b = !(a and b),
事件a
和b
由
a = like '[aeiou]%'
b = like '%[aeiou]'.
此外, a and b
对应于事件like '[aeiou]%[aeiou]'
,它基本上是包含所有事件a
和b
的两个集合的集合交集。
编辑:上一句错误,它会对单元素字符串产生错误的结果。要查找集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,尽管它们不应该被选择。