Мыслительный процесс синтаксиса CASE в SQL - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть следующий код (я использую базу данных 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 Ответ

0 голосов
/ 22 сентября 2018

Вам просто нужно расширить предложение 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 ...

...