在MySQL中选择数据并通过临时列数据限制(WHERE)

时间:2009-08-03 08:43:01

标签: sql mysql

我正在尝试按其状态对订单条目进行排序,但是在我的数据库中没有状态列,我正在尝试使用数据库中其他列的当前值即时生成它。

我在查询中使用CASE语句创建了一个“临时”列。我现在要做的是只获取与CASE列的值匹配的表行。

以下是我到目前为止所做的一个例子:

CASE
  WHEN date_due = 0 AND date_sent = 0 THEN "opened" 
  WHEN date_sent > 0 AND (CURRENT_DATE - date_due) <= 0 THEN "sent" 
END AS status 

我的问题是,当我尝试过滤它时,status现在显然是一个未知的列:

... WHERE status = "sent" ...

在我的案例中,最好的解决方案是什么?是否可以定义包含状态的临时变量?

2 个答案:

答案 0 :(得分:0)

在列之前评估

where。因此,在评估where时,不存在status列。您必须将case语句放在where子句中:

where
    CASE
      WHEN date_due = 0 AND date_sent = 0 THEN "opened" 
      WHEN date_sent > 0 AND (CURRENT_DATE - date_due) <= 0 THEN "sent" 
    END = 'sent'

但更实际的是,你会想要这样做:

where
    date_sent > 0
    and (CURRENT_DATE - date_due) <= 0

可以使用别名列名的唯一子句是order by子句(跨数据库 - 某些数据库,如MySQL,允许您在group by中使用它们。)

答案 1 :(得分:0)

在MySql中,这可行

select
...
CASE
  WHEN date_due = 0 AND date_sent = 0 THEN "opened" 
  WHEN date_sent > 0 AND (CURRENT_DATE - date_due) <= 0 THEN "sent" 
END AS status 

...
from table

where 
... (other conditions) ...

**HAVING status = "sent"**

如果您不需要包含其他条件,请移除WHERE,只留下SELECT ... FROM ... HAVING ...