Oracle SQL where子句计算两列

roejwanj  于 2023-10-16  发布在  Oracle
关注(0)|答案(2)|浏览(89)

我有基本的SQL技能,但我被这个难倒了:

create table scores 
(
    name varchar2(15), 
    history_grade varchar2(1), 
    math_grade varchar2(1)
);
insert into scores (name, history_grade, math_grade) values ('Bill', 'A', 'A');
insert into scores (name, history_grade, math_grade) values ('Sue', 'F', 'F');
insert into scores (name, history_grade, math_grade) values ('Mary', 'C', 'B');
insert into scores (name, history_grade, math_grade) values ('Austin', 'C', 'A');
insert into scores (name, history_grade, math_grade) values ('Kyle', 'B', 'B');

我想查询history_grademath_grade * 都 * 不是'A'或都不是'F'的行。如果history_grade或math_grade中有一个是'A'或'F',但另一个不是'A'或'F',那么我仍然需要这一行。
我在尝试这个:

select * 
from scores 
where (history_grade <> 'A' and math_grade <> 'A')
  and (history_grade <> 'F' and math_grade <> 'F' )

但这只返回玛丽和凯尔。我需要玛丽,凯尔和奥斯汀在结果集中,因为奥斯汀只有一个A,而不是两个A。
我希望这是有意义的,任何帮助都非常感谢!

3vpjnl9f

3vpjnl9f1#

可以使用NOT IN

SELECT * 
FROM   scores 
WHERE  (history_grade, math_grade) NOT IN (('A', 'A'), ('F', 'F'))

也可以使用ANDNOT

SELECT * 
FROM   scores 
WHERE  NOT ( history_grade = 'A' AND math_grade = 'A' )
AND    NOT ( history_grade = 'F' AND math_grade = 'F' )

或:

SELECT * 
FROM   scores 
WHERE  ( history_grade <> 'A' OR math_grade <> 'A' )
AND    ( history_grade <> 'F' OR math_grade <> 'F' );

其中所有输出:
| 名称|历史_等级|数学成绩|
| --|--|--|
| 玛丽|C| B|
| 奥斯汀|C|一|
| 凯尔|B| B|
fiddle

xam8gpfp

xam8gpfp2#

可能是这样的

select * from scores where 
CONCAT( history_grade, math_grade ) not in('AA','FF')

相关问题