简体   繁体   中英

SQL IF statement in the WHERE clause to determine next WHERE/AND

I want to be able to select from my table of work employees, I am able to select ALL of them just fine, but now I want to select all of them under an IF statement. IF company = 'Starbucks' THEN only show specific Starbucks records WHERE startDate > 2022-1-1, whereas all other records must remain regardless of their Company or StartDate

SELECT * FROM MyTable:
Name                    Company           StartDate

Steve Smith             Starbucks          2021-01-01
Alan Smith              Greggs             2021-04-01
Charles Gregory         Starbucks          2022-02-01
Glen Royle              Apple              2022-01-01
Brian Edwards           Starbucks          2021-05-09
James White             Greggs             2022-02-01

I have tried:

SELECT * FROM MYTABLE
WHERE Company != 'Starbucks' 
AND StartDate > '2022-1-1'
//Returns 0 Starbucks employees, and ALL records after 2022-1-1


SELECT * FROM MYTABLE
WHERE StartDate > '2022-1-1'
//Only returns records after 2022-1-1 for ALL companies 

Desired result:

Name                    Company           StartDate

Alan Smith              Greggs             2021-04-01
Charles Gregory         Starbucks          2022-02-01
Glen Royle              Apple              2022-01-01
James White             Greggs             2022-02-01

As you can see from the Desired result table, the two employees that are at Starbucks, with a StartDate BEFORE 2022-01-01 are not being shown, where as everyone else remains, along with the one Starbucks worker that has a StartDate AFTER 2022-01-01

Thank you.

You should be using proper date literals for your database. On MySQL, you would want:

SELECT *
FROM MYTABLE
WHERE Company != 'Starbucks' AND StartDate > '2022-01-01';

On SQL Server you may use:

SELECT *
FROM MYTABLE
WHERE Company != 'Starbucks' AND StartDate > '20220101';

What may have been happening with your current queries is that '2022-1-1' was being treated lexicographically as a string, which then would compare wrongly to the other dates.

Maybe something like this:

SELECT *
FROM MYTABLE
WHERE 1 = CASE WHEN Company = 'Starbucks' AND StartDate <= '2022-01-01' THEN 0 ELSE 1 END;

or

SELECT *
FROM MYTABLE
WHERE Company != 'Starbucks'
UNION ALL
SELECT *
FROM MYTABLE
WHERE Company = 'Starbucks' AND StartDate > '20220101';

I think what you need is

SELECT * FROM MYTABLE
WHERE Company != 'Starbucks' 
OR StartDate > '2022-01-01'

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM