SQL: Почему я должен использовать здесь функцию IN вместо знака равенства и ИЛИ?

#sql #postgresql

#sql #postgresql

Вопрос:

Вопрос: Напишите запрос, который выбирает все столбцы из файла benn.college_football_players и добавляет дополнительный столбец, в котором отображается имя игрока, если этот игрок младший или старший.

Мой ответ:

 SELECT *, 
CASE 
WHEN year = 'JR' OR 'SR' THEN player_name 
ELSE NULL 
END AS highlighted_player
FROM benn.college_football_players
  

Правильный ответ:

 SELECT *,
CASE WHEN year IN ('JR', 'SR') THEN player_name ELSE NULL END AS upperclass_player_name
FROM benn.college_football_players
  

Почему здесь работает функция IN, но не функция = и ИЛИ?

Комментарии:

1. Основная причина в том, что ваша версия синтаксически некорректна.

Ответ №1:

OR это логический оператор, означающий, что он работает с выражениями true / false . Итак, эта конструкция будет работать:

 year = 'JR' OR year = 'SR' 
  

Потому что он анализируется как:

 (year = 'JR') OR (year = 'SR')
  

и эти два выражения являются логическими. Однако это имеет строку и логическое выражение:

 (year = 'JR') OR 'SR' 
  

итак, вы получаете сообщение об ошибке.

И, IN в любом случае, проще и понятнее.

Ответ №2:

Это может работать так:

 CASE WHEN year = 'JR' OR year = 'SR' THEN ...
  

OR Требуется, чтобы оба термина были логическими выражениями. Но 'SR' само по себе это просто строка, а не логическое выражение.

Это не должно удивлять никого с опытом программирования. Практически на любом другом языке программирования (Java, C и т.д.) У вас будет аналогичное требование.

Синтаксис кода не английский.

Ответ №3:

Изменить оператор из

 SELECT *, CASE WHEN year = 'JR' OR 'SR' ... 
  

Для :

 SELECT *, CASE WHEN year = 'JR' OR year = 'SR' ...