我正在尝试查询表格。让我们说3列,颜色,汽车品牌和汽车模型。
我想排除所有蓝色和绿色车型,而不是本田思域。这是我在下面的地方声明:
color not in ("blue", "green")
and (carBrand not = "Honda" and carModel not = "Civic").
我尝试使用上述声明,它实际上排除了所有本田,所有思域,并排除任何蓝色或绿色的颜色。我决定将查询分成两部分并按顺序运行它们:
color not in ("blue","green")
然后从下面的列表中运行:
carBrand not ="Honda" and carModel not = "Civic"
我的问题是,我可以用一个查询而不是两个查询完成上述操作。
仅供参考,我喜欢Honda Civics,只是认为这是一个很好的例子,因为很多人都知道汽车模型。
提前致谢。
在下方添加了新评论,以便于参考。 我尝试使用下面的代码。该代码排除了该方案 红色,本田,雅阁。我还添加了一个数据样本表供参考。谢谢你的帮助。
SELECT Color, CarBrand, CarModel
FROM ColorCarModel
WHERE (
(Color Not In ('green','blue'))
AND (CarBrand Not In 'Honda')
AND (CarModel Not In 'Civic')
);
示例数据:
ID Color CarBrand CarModel
1 Green Honda Civic
2 Blue Honda Civic
3 Red Honda Civic
4 Green Ford Civic
5 Blue Ford Taurus
6 Red Ford Taurus
7 Red Honda Accord
8 Red Ford Explorer
答案 0 :(得分:0)
根据3个过滤器,我没有得到你想要排除的东西......试试这个
不在哪里('蓝色','绿色')和carBrand ='本田'和carModel =' Civic')
答案 1 :(得分:0)
从YourTable中选择Color,CarBrand,CarModel 颜色不在('绿色','蓝色') 和CarBrand NOT IN('本田') 和CarModel NOT IN('思域');
试试这个并告诉我这是否对您有帮助。
答案 2 :(得分:0)
原始where
子句的问题在于您将not in
运算符单独应用于CarBrand和CarModel的群体。你有:
(CarBrand Not In ("Honda")) and (CarModel Not In ("Civic"))
相反,你想要:
Not(CarBrand = "Honda" and CarModel = "Civic")
这是一个有效的例子:
data ColorCarModel;
format id best. color $20. CarBrand $20. CarModel $20.;
input id color CarBrand CarModel;
datalines;
1 Green Honda Civic
2 Blue Honda Civic
3 Red Honda Civic
4 Green Ford Civic
5 Blue Ford Taurus
6 Red Ford Taurus
7 Red Honda Accord
8 Red Ford Explorer
9 Red Dummy Civic
run;
proc sql;
select color, CarBrand, CarModel
from ColorCarModel
where (
upcase(color) not in ('GREEN','BLUE') AND
NOT (upcase(CarBrand) = 'HONDA' AND upcase(CarModel) = 'CIVIC')
);
quit;
另请注意,在将变量与字符串进行比较之前,我将upcase()
应用于变量。这可以防止数据集中由混合大小写引起的问题(即where CarBrand = "Honda"
会错过CarBrand包含“honda”的观察结果。)
如果没有任何嵌套更容易考虑逻辑,下面的SQL通过连接CarModel和CarBrand提供了一个等效的过滤器:
proc sql;
select color, CarBrand, CarModel
from ColorCarModel
where (
upcase(color) not in ('GREEN','BLUE') AND
upcase(catx('-', CarBrand, CarModel)) <> 'HONDA-CIVIC'
);
quit;
因为这些过滤器本质上是命题逻辑,所以关于该主题的好的教程或文本可能是有用的参考。特别是,像De Morgan定律这样的学习规则可以帮助您思考如何将where
子句转换为不同的等效形式,这有助于简化复杂的逻辑。如果你有野心,罗森的Discrete Mathematics是CS课程中使用的标准文本,其中包括关于命题逻辑的早期章节。