我遇到了 SQL 查询问题:
这是我的表格数据:
+------------+--------+--------+------------+------------+
| priceId_PK | mPrice | aPrice | validFrom | validTo |
+------------+--------+--------+------------+------------+
| 1 | 0.00 | 0.00 | 2013-07-01 | 2013-08-31 |
| 2 | 7.50 | 2.50 | 2013-09-01 | 2013-12-31 |
| 3 | 15.00 | 5.00 | 2014-01-01 | 2035-12-31 |
+------------+--------+--------+------------+------------+
我的 SQL 查询是
SELECT mPrice, aPrice,
CASE
WHEN validFrom < '2013-11-01'
THEN '2013-11-01'
ELSE validFrom END AS validFrom,
CASE
WHEN validTo > '2013-11-30'
THEN '2013-11-30'
ELSE validTo END AS validTo
FROM commission
WHERE (validfrom BETWEEN '2013-11-01' AND '2013-11-30' OR validto BETWEEN '2013-11-01' AND '2013-11-30') ORDER BY validFrom
我的预期结果:
+--------+--------+------------+------------+
| mPrice | aPrice | validFrom | validTo |
+--------+--------+------------+------------+
| 7.50 | 2.50 | 2013-11-01 | 2013-11-30 |
+--------+--------+------------+------------+
但查询实际上返回一个空集。
没有WHERE
条件,查询是
SELECT mPrice, aPrice,
CASE
WHEN validFrom < '2013-11-01'
THEN '2013-11-01'
ELSE validFrom END AS validFrom,
CASE
WHEN validTo > '2013-11-30'
THEN '2013-11-30'
ELSE validTo END AS validTo
FROM commission
返回:
+--------+--------+------------+------------+
| mPrice | aPrice | validFrom | validTo |
+--------+--------+------------+------------+
| 0.00 | 0.00 | 2013-11-01 | 2013-08-31 |
| 7.50 | 2.50 | 2013-11-01 | 2013-11-30 |
| 15.00 | 5.00 | 2014-01-01 | 2013-11-30 |
+--------+--------+------------+------------+
我的问题是,为什么带有 WHERE
条件的查询在我期望返回单个结果集时返回空数据?
是不是the execution order of SELECT
and WHERE
conditions的问题?
还是 WHERE
条件无法正常工作的另一个问题?
最佳答案
我认为您正在尝试从 where 条件下的案例查询中访问 validFrom
和 validTo
。如果是这种情况,您需要重新格式化查询。
SELECT t1.* FROM ( SELECT mPrice, aPrice,
CASE
WHEN validFrom < '2013-11-01'
THEN '2013-11-01'
ELSE validFrom END AS validFrom,
CASE
WHEN validTo > '2013-11-30'
THEN '2013-11-30'
ELSE validTo END AS validTo
FROM commission) t1
WHERE ((t1.validfrom BETWEEN '2013-11-01' AND '2013-11-30') OR (t1.validto BETWEEN '2013-11-01' AND '2013-11-30')) ORDER BY t1.validFrom
但这将返回 3 个结果。如果您需要获得预期的结果,那么您需要使用 AND
条件而不是 OR
。
那么你的查询将是
SELECT t1.* FROM ( SELECT mPrice, aPrice,
CASE
WHEN validFrom < '2013-11-01'
THEN '2013-11-01'
ELSE validFrom END AS validFrom,
CASE
WHEN validTo > '2013-11-30'
THEN '2013-11-30'
ELSE validTo END AS validTo
FROM commission) t1
WHERE ((t1.validfrom BETWEEN '2013-11-01' AND '2013-11-30') AND (t1.validto BETWEEN '2013-11-01' AND '2013-11-30')) ORDER BY t1.validFrom
关于mysql - SQL 中的 WHERE 条件问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20464587/