Мыслительный процесс синтаксиса CASE в SQL

У меня есть следующий код (я использую базу данных Northwind), который дает мне результат, показанный на этом рисунке

SELECT a.FirstName, a.TitleOfCourtesy, a.Notes, c.CustomerYear
FROM employees a
    INNER JOIN orders b
    ON a.EmployeeID = b.EmployeeID
    LEFT JOIN customers c
    ON b.CustomerID = c.CustomerID
WHERE a.TitleOfCourtesy = 'Ms.';

Код выше объединяет три таблицы и выбирает только строки с a.TitleOfCourtesy = 'Ms.'

Из результата я хочу взять строки, которые имеют %1992% в столбце a.Notes и показывать только те строки, которые имеют c.CustomerYear равен 1992. Поэтому на картинке ранее я должен видеть только второй верхний ряд.

Я думал, что мог бы использовать синтаксис CASE + WHEN для создания своего рода оператора IF, но я получаю недопустимое использование синтаксиса только в строке CASE. Следует ли перемещать деталь CASE после детали WHERE или я использую ее совершенно неправильно?

SELECT a.FirstName, a.TitleOfCourtesy, a.Notes, c.CustomerYear

CASE 
    WHEN a.Notes LIKE '%1992%' THEN c.CustomerYear LIKE '1992' 
    ELSE NULL END 

FROM employees a
    INNER JOIN orders b
    ON a.EmployeeID = b.EmployeeID
    LEFT JOIN customers c
    ON b.CustomerID = c.CustomerID
WHERE a.TitleOfCourtesy = 'Ms.';

Как я должен думать, чтобы достичь желаемого результата?

1 ответ

Решение

Вам просто нужно расширить WHERE пункт...

SELECT a.FirstName, a.TitleOfCourtesy, a.Notes, c.CustomerYear
FROM employees a
    INNER JOIN orders b
    ON a.EmployeeID = b.EmployeeID
    LEFT JOIN customers c
    ON b.CustomerID = c.CustomerID
WHERE a.TitleOfCourtesy = 'Ms.'
  AND a.Notes LIKE '%1992%'
  AND c.CustomerYear LIKE '1992';

Я также вижу только одну подходящую строку на вашем изображении, а не две. Так что, возможно, я неправильно понял, чего вы хотите достичь... Может быть, вы хотите, чтобы это получилось в два ряда?

SELECT a.FirstName, a.TitleOfCourtesy, a.Notes, c.CustomerYear
FROM employees a
    INNER JOIN orders b
    ON a.EmployeeID = b.EmployeeID
    LEFT JOIN customers c
    ON b.CustomerID = c.CustomerID
WHERE a.TitleOfCourtesy = 'Ms.'
  AND a.Notes LIKE '%1992%'
  AND (c.CustomerYear LIKE '1992' OR c.CustomerYear IS NULL)

Наконец, вам не нужно LIKE '1992' Вы можете просто использовать = '1992'и если значение является целым числом, просто используйте = 1992...

Другие вопросы по тегам