MySQL Alias和Field具有相同的名称 - 在Having子句中进行评估?

时间:2016-02-16 08:14:35

标签: mysql case alias having

我有一个mysql查询,它连接了我无法编辑的多个表中的电话号码,我需要创建一个与其中一个表具有相同字段名称的输出。我使用CASE语句来执行此操作。这是我的查询的简单版本:

SELECT t1.`id` as id,
CASE 
    WHEN t1.`has_company_phone` = 1  THEN t1.`company_phone`
    ELSE t2.`phone`
END AS `phone`
FROM `input_table1` t1, 
LEFT OUTER JOIN `input_table2` t2
    ON (t2.`id` = t1.`matched_company_id`)
HAVING phone IS NOT NULL;

编辑: 在这个查询中,在HAVING子句中是t2.phone被评估,别名电话,还是两者兼而有之?我的目标是在此having子句中评估别名。

EG:t1.company_phone存在,但t2.phone IS NULL。我想使用t1.company_phone包含此记录,别名为phone。如果我将HAVING更改为WHERE子句,则不会显示此记录。

4 个答案:

答案 0 :(得分:1)

用下列替换你:

group by t1.`has_company_phone`, t2.`phone`
HAVING CASE 
    WHEN t1.`has_company_phone` = 1  THEN t1.`company_phone`
    ELSE t2.`phone`
END is not null

小心不要错过小组。

或者,您可以在没有分组的地方使用条件。

where CASE 
    WHEN t1.`has_company_phone` = 1  THEN t1.`company_phone`
    ELSE t2.`phone`
END is not null

答案 1 :(得分:1)

在MySQL中,HAVING子句将始终从选择列表中搜索所需的项目。

在选择列表中找到后,将使用找到的项目。

如果未找到,则抛出错误。

更新

实际上,在你的SQL中,你应该用WHERE替换HAVING,因为它与WHERE相同。 使用WHERE,混乱将会消失。 WHERE子句将始终使用实际表列,而不是别名。

答案 2 :(得分:0)

在这种情况下,我接受了Shadow的建议,并构建了一个测试,看看会发生什么。我用一部NULL手机填写了t2并将手机放入t1。

评估别名是因为来自t1的记录包含在我的结果中。

然后我反转了这些值,因此t1.company_phone为NULL并且t2.phone有一个值,并重新查询。没有评估t2.phone字段名称,因为在反转数据后没有显示结果。

Boody的建议可能是获得所需功能的更明确的方式,但在我的情况下,我有大约20个字段将在多个案例和4个表中合并,因此查询将变得非常混乱,因为显式。

答案 3 :(得分:0)

使用union,您只需执行以下操作:

select distinct id,  case when phone1 = '' then phone2 else phone1 end as phone from
(select matched_company_id as id, company_phone as phone1, '' as phone2 from `input_table1`
union 
select id as id, '' as phone1, phone as phone2 from `input_table2`) as t
where phone <> ''

然后您可以类似地添加任何其他表或字段。