SQL中的WHERE条件问题

时间:2013-12-09 06:37:11

标签: mysql 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条件的查询会返回空数据?

the execution order of SELECT and WHERE conditions是否有问题?

或者WHERE条件无法正常工作的另一个问题是什么?

5 个答案:

答案 0 :(得分:3)

我认为您正尝试在where条件中从案例查询中访问validFromvalidTo。如果是这种情况,则需要重新格式化查询。

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中使用列别名   条款。