Как использовать оператор МЕЖДУ и ИЛИ вместе в SQL-запросе

#mysql #sql #jpa #mssql-jdbc

Вопрос:

У меня возникли проблемы с sql-запросом для фильтрации данных между диапазонами дат и несколькими условиями. Вот мой запрос, он возвращает данные, но BETWEEN диапазон дат работает не так, как ожидалось.

 select CAL_DT as CALDATE,
sum (ORDER_PALL) as PALL, 
sum (ORDER_QTY) as UNI 
from [ORDER] 
where CAL_DT BETWEEN '2021-08-07' and '2021-08-16' or
TYPE IN ('MANUAL','SYSTEM') OR
GMM IN ('123','345') 
group by CAL_DT order by CAL_DT ASC
 

выход:

 CALDATE       PALL    UNI

2021-08-04     200     50
2021-08-05     600     30
2021-08-06     300     20
2021-08-07     0       10
2021-08-08     700     90
2021-08-09     300     20
2021-08-10     700     10
 

ОЖИДАЕМЫЙ ВЫХОД ПОЛОЖЕН:

 CALDATE       PALL    UNI

2021-08-07     0       10
2021-08-08     700     90
2021-08-09     300     20
2021-08-10     700     10
 

Мои условия TYPE и GMM иногда могут быть нулевыми. Вот почему я хочу использовать OR .

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

1. Зачем нужен тег для драйвера JDBC SQL Server, если вы используете MySQL? Вы подаете в суд на Microsoft SQL Server или MySQL?

Ответ №1:

Это звучит так, как будто, возможно, вы этого хотели, и вместе взятые критерии в вашем WHERE предложении:

 SELECT CAL_DT AS CALDATE,
       SUM(ORDER_PALL) AS PALL,
       SUM(ORDER_QTY) AS UNI
FROM [ORDER]
WHERE CAL_DT BETWEEN '20210807' AND '20210816' AND
      TYPE IN ('MANUAL', 'SYSTEM')
GROUP BY CAL_DT
ORDER BY CAL_DT;
 

Примечание: Поскольку вы, похоже, используете SQL Server, а не MySQL, вам следует использовать однозначные литералы даты. Так что используйте '20210807' , а не '2021-08-07' .

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

1. На самом деле у меня есть несколько условий, таких как TYPE в предложении where. Например: GMM IN ('123','456') . Эти значения могут несколько раз быть пустыми. Вот почему я использовал OR оператора. В этом случае запрос возвращает данные не так, как ожидалось. Также обновлен вопрос.