使用SQL - 列查询表

时间:2014-10-06 19:46:28

标签: sql filter

我正在尝试查询表格。让我们说3列,颜色,汽车品牌和汽车模型。

我想排除所有蓝色和绿色车型,而不是本田思域。这是我在下面的地方声明:

color not in ("blue", "green") 
and (carBrand not = "Honda" and carModel not = "Civic").  

我尝试使用上述声明,它实际上排除了所有本田,所有思域,并排除任何蓝色或绿色的颜色。我决定将查询分成两部分并按顺序运行它们:

  1. color not in ("blue","green")

    然后从下面的列表中运行:

  2. carBrand not ="Honda" and carModel not = "Civic"

  3. 我的问题是,我可以用一个查询而不是两个查询完成上述操作。

    仅供参考,我喜欢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
    

3 个答案:

答案 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课程中使用的标准文本,其中包括关于命题逻辑的早期章节。