使用coalesce或if where where子句mysql

时间:2012-07-04 10:04:24

标签: mysql

我使用这样的一些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

我该怎么办呢?

3 个答案:

答案 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 BYORDER BYHAVING子句中的别名来引用该列:

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