2

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

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

我如何使用“mecit”作为变量(如果可能,不使用存储过程)。

4

2 回答 2

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 被解析之前是不可见的,这是引擎要查看的查询的最后(或几乎)最后一部分。

注意:如果您使用的表存在名称冲突,则需要限定列名。

于 2013-06-13T10:16:14.260 回答
1

列别名问题中所述

可以在查询选择列表中使用别名来为列指定不同的名称。您可以使用 、 或 子句中的别名GROUP BYORDER BY引用HAVING该列:

[删除]

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

因此,您不能mecitWHERE子句中通过别名引用。虽然您可以将过滤器移动到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
于 2013-06-13T10:17:50.517 回答