我遇到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
条件无法正常工作的另一个问题是什么?
答案 0 :(得分:3)
我认为您正尝试在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
答案 1 :(得分:0)
你可以尝试这个吗,为validfrom和validto列添加适当的()
WHERE ( (validfrom BETWEEN '2013-11-01' AND '2013-11-30') OR (validto BETWEEN '2013-11-01' AND '2013-11-30') ) ORDER BY validFrom
答案 2 :(得分:0)
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
答案 3 :(得分:0)
试试这个,
WHERE
((validfrom BETWEEN '2013-11-01' AND '2013-11-30') OR
(validto BETWEEN '2013-11-01' AND '2013-11-30'))
ORDER BY validFrom
答案 4 :(得分:0)
我从Google那里获得了有关我的问题的有用数据。
标准SQL不允许您引用WHERE中的列别名 条款。强制执行此限制是因为WHERE代码是 执行后,列值可能尚未确定。
您只能在GROUP BY,ORDER BY或HAVING中使用列别名 条款。