2012-07-27 253 views
3

我在理解LIKE和NOT LIKE运算符时遇到了问题。这是我执行的一个查询:SQL不喜欢和喜欢

select serial_number from UNIT U 
group by serial_number 
order by serial_number 

它可以产生2000个结果。

当我执行此查询,我得到1950结果:

select serial_number from UNIT U 
WHERE op_name LIKE 'Assembly' 
group by serial_number 
order by serial_number 

所以,当我执行这个查询,我希望得到50个结果,而是我可以获得2000:

select serial_number from UNIT U 
WHERE op_name NOT LIKE 'Assembly' 
group by serial_number 
order by serial_number 

任何解释吗?谢谢一堆。

回答

3

你正在做的这个组使得它不能真正有效地进行你正在尝试的那种计数比较。 假设您有10个唯一的序列号,并且对于每个序列号,有两行(共20行),一个带op_name“Xyz”,另一个带op_name“Assembly”。您的第一个查询将返回10行。您的第二个查询将返回10行。您的第三个查询将返回10行。由于该组,LIKE“Assembly”和NOT LIKE“Assembly”并不相互排斥。

+0

谢谢,我意识到矛盾消失了,当我拿走小组的时候。我不太清楚如何解决这个问题,因为我需要群组获得唯一的序列号,但这是一个开始。 – user1558927 2012-07-28 00:22:08

0

没有通配符%您的LIKE就像=一样运作。

检查,看看是什么值?最有可能的,如果你使用的是LIKE,你也想使用通配符,例如:

选择SERIAL_NUMBER从单元U WHERE op_name NOT LIKE“%组装% '基团通过SERIAL_NUMBER为了通过SERIAL_NUMBER

2

NULL既不LIKE也不NOT LIKE任何东西。


其实,仔细阅读你的号码,可能还有其他原因。 (我更早一点是事实,但这种可能性更大)。

假设你有以下数据:

serial_number | op_name 
--------------+--------- 
1    | Assembly 
1    | Not 

1将通过这两个查询返回。

+0

对呀! :-) – richard 2012-07-28 00:09:42

+0

嗯,我不认为该op_name被称为不。只是为了进一步的信息,如果我做op_name ='Assembly'和op_name!='Assembly'而不是LIKE和NOT LIKE – user1558927 2012-07-28 00:12:48

+0

@ user1558927,op_name ='Assembly'和op_name如'Assembly'是完全相同的同样的!=和不喜欢),所以你应该期待同样的事情发生。 – hatchet 2012-07-28 00:20:32