【问题标题】:Querying a table using SQL - columns使用 SQL 查询表 - 列
【发布时间】:2015-04-24 10:49:56
【问题描述】:

我正在尝试查询表。假设有 3 列,颜色、汽车品牌和汽车型号。

我想排除所有蓝色和绿色的汽车,不包括本田思域。这是我在下面的 where 语句:

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"

我的问题是,我可以用一个查询而不是两个查询来完成上述操作吗?

仅供参考,我喜欢本田思域,只是认为这是一个很好的例子,因为很多人都知道那个车型。

提前致谢。


在下面添加了新的 cmets 以方便参考。 我尝试使用下面的代码。代码不包括场景 红色,本田,雅阁。我还添加了数据示例表以供参考。感谢您的帮助。

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

【问题讨论】:

  • 您的意思是应该排除所有 Hondas 和所有 Civics,还是只排除那些有 Honda 而不是 Civic,或 Civic 而不是 Honda 的记录?

标签: sql filter


【解决方案1】:

从 YourTable 中选择颜色、汽车品牌、汽车型号 WHERE 颜色不在 ('green','blue') 并且 CarBrand 不在(“本田”) 并且 CarModel 不在('Civic');

试试这个,如果这对你有帮助,请告诉我。

【讨论】:

  • 我尝试使用下面的代码,应该和上面的一样。代码不包括Red、Honda、Accord的场景。我还添加了数据示例表以供参考。谢谢您的帮助。从 ColorCarModel WHERE ((Color Not In ('green','blue')) AND (CarBrand Not In 'Honda') AND (CarModel Not In 'Civic') 中选择 Color、CarBrand、CarModel); ID 颜色 CarBrand CarModel 1 绿色本田思域 2 蓝色本田思域 3 红色本田思域 4 绿色福特思域 5 蓝色福特金牛座 6 红色福特金牛座 7 红色本田雅阁 8 红色福特探险家
【解决方案2】:

根据 3 个过滤器,我没有得到您想要排除的内容...试试这个

哪里不是(颜色在 ('blue','green') 和 carBrand ='Honda' 和 carModel = 'Civic')

【讨论】:

    【解决方案3】:

    您原来的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;
    

    因为这些过滤器本质上是命题逻辑,所以关于该主题的优秀教程或文本可能是有用的参考。特别是,像德摩根定律这样的学习规则可以帮助您思考如何将where 子句转换为不同的等效形式,这有助于简化复杂的逻辑。如果您有雄心壮志,Rosen 的 Discrete Mathematics 是 CS 课程中使用的标准文本,其中包括关于命题逻辑的早期章节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-25
      • 2015-07-17
      • 2011-08-31
      • 2021-05-08
      • 1970-01-01
      相关资源
      最近更新 更多