繁体   English   中英

SQL中的条件问题

[英]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条件的查询返回空数据?

SELECTWHERE条件的执行顺序是否有问题?

还是WHERE条件无法正常运行的另一个问题?

我认为您正在尝试从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

您能尝试一下吗,为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM