mysql - SQL 中的 WHERE 条件问题

标签 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 条件无法正常工作的另一个问题?

最佳答案

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

关于mysql - SQL 中的 WHERE 条件问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20464587/

相关文章:

mysql - 如何将 INSERT ... SELECT 与特定列自动递增(从 1 开始)一起使用?

php - 字段列表中的列 'wine_id' 不明确错误,无法弄清楚原因

mysql - 从一个表中选择所有内容,如果存在,则在另一表上获取更多详细信息

sql - 在 Oracle BIND 变量中声明多个值

mysql - 将选定记录从 MySQL 数据库导出到 SQLite 数据库需要哪些命令?

php - 我如何结合这两个查询来计算排名变化?

sql - 根据交易日期计算客户的行程

SQL为每个类别获取1条随机记录

sql - 使用另一个表作为信息查询更新表?

MySQL : Indexes for View based on an aggregated query