我使用这样的一些sql:
SELECT COALESCE(group.display,item.display) as display....
我想在WHERE子句中添加:
WHERE display='1'
WHERE显示是合并的结果。
同样,我希望能够做同样的事情:
IF(ISNULL(gd.group_main_image),p.main_image,gd.group_main_image) AS image
... WHERE image IS NOT NULL
我该怎么办呢?
答案 0 :(得分:2)
您不能在同一级别的查询中使用别名。
你必须重复自己。
WHERE COALESCE(group.display,item.display) = '1'
修改强>
嗯,我的限制太多了。您可以在MySql中的having子句中使用别名。您无法在其他DBMS(Oracle,SQl Server)中执行此操作。通常,ANSI SQL中也不允许这样做。
答案 1 :(得分:0)
您无法在WHERE
子句
所以:
WHERE COALESCE(group.display,item.display)='1'
OR:
HAVING display='1'
但是,在发现所有结果集后执行HAVING
,所以基本上这会占用更多内存
答案 2 :(得分:0)
如Problems with Column Aliases中所述:
可以在查询选择列表中使用别名为列提供不同的名称。您可以使用
GROUP BY
,ORDER BY
或HAVING
子句中的别名来引用该列:SELECT SQRT(a*b) AS root FROM tbl_name GROUP BY root HAVING root > 0; SELECT id, COUNT(*) AS cnt FROM tbl_name GROUP BY id HAVING cnt > 0; SELECT id AS 'Customer identity' FROM tbl_name;标准SQL不允许在
WHERE
子句中引用列别名。强制执行此限制是因为在评估WHERE
子句时,可能尚未确定列值。例如,以下查询是非法的:SELECT id, COUNT(*) AS cnt FROM tbl_name WHERE cnt > 0 GROUP BY id;
WHERE
子句确定GROUP BY
子句中应包含哪些行,但它引用的列别名是在选择行之后才知道的,并按GROUP BY
。