[英]WHERE condition issue in SQL
我遇到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
条件的查询返回空数据?
SELECT
和WHERE
条件的执行顺序是否有问题?
还是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
您能尝试一下吗,为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
你试试这个吗?
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
这样尝试
WHERE
((validfrom BETWEEN '2013-11-01' AND '2013-11-30') OR
(validto BETWEEN '2013-11-01' AND '2013-11-30'))
ORDER BY validFrom
我从Google获得了有关我的问题的有用数据。
标准SQL不允许您在WHERE子句中引用列别名。 之所以施加此限制,是因为执行WHERE代码时,可能尚未确定列值。
您只能在GROUP BY,ORDER BY或HAVING子句中使用列别名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.