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

MySQL Alias and Field have same name - Which is evaluated in Having clause?

我有一个 mysql 查询,它连接来自多个表的 phone 数字,我无法编辑它,我需要创建一个与其中一个表具有相同字段名称的输出。我正在使用 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、别名 phone 或两者?我的目标是在此 having 子句中评估别名。

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

用下面的替换你拥有的:

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

注意不要错过分组。

或者,你可以在没有group by的情况下使用where中的条件。

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

在MySQL中,HAVING子句总是从select列表中搜索需要的项目。

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

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

更新:

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

在这种情况下,我采纳了 Shadow 的建议并构建了一个测试以查看会发生什么。我用 NULL phone 填充了 t2 并在 t1.

中放了一个 phone

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

然后我反转了这些值,所以 t1.company_phone 是 NULL 而 t2.phone 有一个值,然后重新运行查询。 t2.phone 字段名称未被评估,因为在反转数据后没有结果显示。

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

使用 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 <> ''

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