我有一个mysql查询,它连接多个无法编辑的表的电话号码,我需要创建一个与其中一个表具有相同字段名的输出。我用一个案例陈述来做这件事。下面是我的查询的一个简单版本:
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正在计算,还是别名phone,或者两者都是?我的目标是在这个having子句中计算别名。
t1.company_phone存在,但是t2. exists是空的。我希望使用t1.company_phone包括此记录,并使用别名be phone。如果我将WHERE改为WHERE子句,则此记录将不会显示。
发布于 2016-02-16 09:03:18
在MySQL中,will子句总是从select列表中搜索所需的项。
一旦在“选择”列表中找到,将使用找到的项。
如果找不到,则抛出错误。
更新:
实际上,在您的SQL中,应该用WHERE替换WHERE,因为它与WHERE相同。用什么地方,混乱就会消失。WHERE子句将始终使用实表列,而不是别名。
发布于 2016-02-16 08:33:17
用以下一种取代你的:
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中使用该条件而不使用group。
where CASE
WHEN t1.`has_company_phone` = 1 THEN t1.`company_phone`
ELSE t2.`phone`
END is not null发布于 2016-02-16 09:04:53
在这种情况下,我接受了影子的建议,并建立了一个测试,看看会发生什么。我用一个空电话填充了t2,并在t1中放了一个电话。
评估别名是因为来自t1的记录包含在我的结果中。
然后,我反转了值,使t1.company_phone为NULL,t2.phone有一个值,并重新运行查询。没有评估t2.phone字段名,因为在反转数据后没有显示结果。
Boody的建议可能是获得所需功能的更明确的方式,但在我的例子中,我有大约20个字段将被合并到多个案例和4个表中,所以查询会变得非常混乱。
https://stackoverflow.com/questions/35427117
复制相似问题