我需要一个像下面这样不起作用的查询:
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'作为变量(如果可能,不使用存储过程)。
答案 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 BY
,ORDER BY
或HAVING
子句中的别名来引用该列:[ 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