mysql查询,使用结果作为变量

时间:2013-06-13 10:13:41

标签: mysql variables case case-when

我需要一个像下面这样不起作用的查询:

SELECT *, 
 CASE 
  WHEN x_sutun1 = '1' OR x_sutun2 >= CURRENT_DATE() THEN 0 
  WHEN x_sutun1 < 1 AND x_sutun2 < CURRENT_DATE() THEN 1 
 END as mecit
FROM tablo1
LEFT JOIN tablo2 ON x_sutun0 = y_sutun0
LEFT JOIN tablo3 ON x_sutun0 = z_sutun0
WHERE x_sutun3 + mecit < 4

如何使用'meat'作为变量(如果可能,不使用存储过程)。

2 个答案:

答案 0 :(得分:1)

将查询包装在外部查询中,如下所示:

select * from
(
SELECT 
 *
 , CASE 
  WHEN x_sutun1 = '1' OR x_sutun2 >= CURRENT_DATE() THEN 0 
  WHEN x_sutun1 < 1 AND x_sutun2 < CURRENT_DATE() THEN 1 
 END as mecit
FROM tablo1
) m
LEFT JOIN tablo2 ON x_sutun0 = y_sutun0
LEFT JOIN tablo3 ON x_sutun0 = z_sutun0
WHERE x_sutun3 + m.mecit < 4

这样做的原因是,在解析SELECT之前,您使用的别名是不可见的,这是引擎要查看的查询的最后一个(或几乎)最后一部分。

注意:如果您对正在使用的表有名称冲突,则需要对列名进行限定。

答案 1 :(得分:1)

正如Problems with Column Aliases所述:

  

可以在查询选择列表中使用别名为列提供不同的名称。您可以使用GROUP BYORDER BYHAVING子句中的别名来引用该列:

[ deletia ]
     

标准SQL不允许在WHERE子句中引用列别名。强制执行此限制是因为在评估WHERE子句时,可能尚未确定列值。

因此,您无法在mecit子句中通过别名引用WHERE。虽然您可以将过滤器移动到HAVING子句(或外部查询),但这通常效率不高(因为在计算并返回所有结果之前无法过滤记录):您最好只重复直接在WHERE子句中表达式(更详细,但性能更高):

SELECT *, 
 CASE 
  WHEN x_sutun1 = '1' OR x_sutun2 >= CURRENT_DATE() THEN 0 
  WHEN x_sutun1 <  1 AND x_sutun2 <  CURRENT_DATE() THEN 1 
 END as mecit
FROM tablo1
LEFT JOIN tablo2 ON x_sutun0 = y_sutun0
LEFT JOIN tablo3 ON x_sutun0 = z_sutun0
WHERE x_sutun3 + CASE 
  WHEN x_sutun1 = '1' OR x_sutun2 >= CURRENT_DATE() THEN 0 
  WHEN x_sutun1 <  1 AND x_sutun2 <  CURRENT_DATE() THEN 1 
 END < 4