查询返回 WHERE 条件范围之外的数据
Query returning data outside the scope of the WHERE condition
我正在尝试根据日期时间和状态从 table 中检索汇总数据。
问题是我需要多个状态值 ex。 'where 1 or 2 or 3'
SELECT SUM(ticketTotalAmount)
FROM tickets
WHERE ticketDate >= '2019/04/01 00:00:00' AND ticketDate <= '2019/04/02 23:59:59'
AND ticketState = 'STAND BY'
OR ticketState = 'WIN'
OR ticketState = 'LOSE'
输出应根据这 3 种状态(获胜、失败或待机)中的任何一种检索汇总数据,并且在 ticketDate 的范围内,但实际输出超出了 DateTime 限制的范围。
去除状态条件,只保留日期时间检索条件范围内的数据。问题是不止这3个状态。
将工单状态条件括在圆括号内
SELECT SUM(ticketTotalAmount) FROM tickets
WHERE ticketDate >= '2019/04/01 00:00:00' AND ticketDate <= '2019/04/02 23:59:59' AND ( ticketState = 'STAND BY' OR ticketState = 'WIN' OR ticketState = 'LOSE')
使用IN
SELECT SUM(ticketTotalAmount) FROM tickets
WHERE ticketDate >= '2019/04/01 00:00:00' AND ticketDate <= '2019/04/02 23:59:59'
AND ticketState in( 'STAND BY' , 'WIN' ,'LOSE')
问题是 AND
和 OR
子句的顺序。
试试这个:
SELECT SUM(ticketTotalAmount)
FROM tickets
WHERE ticketDate >= '2019/04/01 00:00:00' AND ticketDate <= '2019/04/02 23:59:59' AND
(ticketState = 'STAND BY' OR ticketState = 'WIN' OR ticketState = 'LOSE');
甚至更好:
SELECT SUM(ticketTotalAmount)
FROM tickets
WHERE ticketDate BETWEEN '2019/04/01 00:00:00' AND '2019/04/02 23:59:59'
AND ticketState IN ('STAND BY', 'WIN', 'LOSE');
我建议这样写查询:
SELECT SUM(t.ticketTotalAmount)
FROM tickets t
WHERE t.ticketDate >= '2019-04-01' AND
t.ticketDate < '2019-04-03' AND
t.ticketState IN ('STAND BY', 'WIN', 'LOSE');
注意查询的变化:
- 而不是
OR
,使用 IN
。它更清楚。这解决了您的明确问题。
- 日期逻辑得到简化,因此您不必处理时间值(或一天中最后几毫秒内出现的值)。
- table 别名是个好主意;我通常认为它们在只有一个 table.
的查询中是可选的
使用 IN([...])
更易于阅读,但查看和理解括号对条件分组的用法很有用,这样您就可以获得所需的结果。示例:
SELECT SUM(ticketTotalAmount)
FROM tickets
WHERE
ticketDate >= '2019/04/01 00:00:00'
AND ticketDate <= '2019/04/02 23:59:59'
AND
(
ticketState = 'STAND BY'
OR ticketState = 'WIN'
OR ticketState = 'LOSE'
)
我正在尝试根据日期时间和状态从 table 中检索汇总数据。 问题是我需要多个状态值 ex。 'where 1 or 2 or 3'
SELECT SUM(ticketTotalAmount)
FROM tickets
WHERE ticketDate >= '2019/04/01 00:00:00' AND ticketDate <= '2019/04/02 23:59:59'
AND ticketState = 'STAND BY'
OR ticketState = 'WIN'
OR ticketState = 'LOSE'
输出应根据这 3 种状态(获胜、失败或待机)中的任何一种检索汇总数据,并且在 ticketDate 的范围内,但实际输出超出了 DateTime 限制的范围。
去除状态条件,只保留日期时间检索条件范围内的数据。问题是不止这3个状态。
将工单状态条件括在圆括号内
SELECT SUM(ticketTotalAmount) FROM tickets
WHERE ticketDate >= '2019/04/01 00:00:00' AND ticketDate <= '2019/04/02 23:59:59' AND ( ticketState = 'STAND BY' OR ticketState = 'WIN' OR ticketState = 'LOSE')
使用IN
SELECT SUM(ticketTotalAmount) FROM tickets
WHERE ticketDate >= '2019/04/01 00:00:00' AND ticketDate <= '2019/04/02 23:59:59'
AND ticketState in( 'STAND BY' , 'WIN' ,'LOSE')
问题是 AND
和 OR
子句的顺序。
试试这个:
SELECT SUM(ticketTotalAmount)
FROM tickets
WHERE ticketDate >= '2019/04/01 00:00:00' AND ticketDate <= '2019/04/02 23:59:59' AND
(ticketState = 'STAND BY' OR ticketState = 'WIN' OR ticketState = 'LOSE');
甚至更好:
SELECT SUM(ticketTotalAmount)
FROM tickets
WHERE ticketDate BETWEEN '2019/04/01 00:00:00' AND '2019/04/02 23:59:59'
AND ticketState IN ('STAND BY', 'WIN', 'LOSE');
我建议这样写查询:
SELECT SUM(t.ticketTotalAmount)
FROM tickets t
WHERE t.ticketDate >= '2019-04-01' AND
t.ticketDate < '2019-04-03' AND
t.ticketState IN ('STAND BY', 'WIN', 'LOSE');
注意查询的变化:
- 而不是
OR
,使用IN
。它更清楚。这解决了您的明确问题。 - 日期逻辑得到简化,因此您不必处理时间值(或一天中最后几毫秒内出现的值)。
- table 别名是个好主意;我通常认为它们在只有一个 table. 的查询中是可选的
使用 IN([...])
更易于阅读,但查看和理解括号对条件分组的用法很有用,这样您就可以获得所需的结果。示例:
SELECT SUM(ticketTotalAmount)
FROM tickets
WHERE
ticketDate >= '2019/04/01 00:00:00'
AND ticketDate <= '2019/04/02 23:59:59'
AND
(
ticketState = 'STAND BY'
OR ticketState = 'WIN'
OR ticketState = 'LOSE'
)