MySQL不区分大小写的连接

时间:2014-02-03 21:54:58

标签: mysql join case-insensitive

我有一个名为work的表,其中包含企业中每个人的注册信息,如下所示:

表:工作

FirstName LastName SponsorshipStatus EnrollmentStatus AdjudicationStatus
--------- -------- ----------------- ---------------- ------------------
JANE      DOE      Complete          Incomplete       Incomplete
JOHN      DOE      Complete          Complete         Incomplete
MONTY     PYTHON   Complete          Complete         Complete
MARY      POPPINS  Complete          Complete         Complete

部门经理给我一份她的员工名单,如下面的员工,她需要更新状态:

表:员工

FirstName LastName
--------- --------
John      Doe
Mary      Poppins
Humpty    Dumpty

知道两个表的情况不匹配,我尝试以下查询:

SELECT employees.FirstName, employees.LastName,
    SponsorshipStatus, EnrollmentStatus, AdjudicationStatus
    FROM employees LEFT JOIN work
    ON (UPPER(employees.FirstName) LIKE UPPER(work.FirstName)
    AND UPPER(employees.LastName) LIKE UPPER(work.LastName));

...它产生以下内容:

查询结果:

FirstName LastName SponsorshipStatus EnrollmentStatus AdjudicationStatus
--------- -------- ----------------- ---------------- ------------------
JOHN      DOE      NULL              NULL             NULL
MARY      POPPINS  NULL              NULL             NULL
HUMPTY    DUMPTY   NULL              NULL             NULL

这是我期望从查询中得到的:

FirstName LastName SponsorshipStatus EnrollmentStatus AdjudicationStatus
--------- -------- ----------------- ---------------- ------------------
JOHN      DOE      Complete          Complete         Incomplete
MARY      POPPINS  Complete          Complete         Complete
HUMPTY    DUMPTY   NULL              NULL             NULL

我在这里做错了什么?左连接正常工作,但它没有进行匹配并从工作表中提取相关数据,所有空值都证明了这一点。

我已经在这里查看了很多帖子,但这些帖子似乎都没有在这里帮助我。

2 个答案:

答案 0 :(得分:5)

你在滥用LIKE。除非您进行模式匹配,否则请勿使用LIKE。改变

UPPER(employees.FirstName) LIKE UPPER(work.FirstName)

UPPER(employees.FirstName) = UPPER(work.FirstName)

同样使用姓氏。

答案 1 :(得分:1)

从MySQL 5.0.3开始,当您检索VARCHAR列的值时,会包含任何尾随空格。这可能是个问题,因为在使用=比较时,会忽略尾随空格,而考虑使用LIKE尾随空格。

SELECT 'foo' = 'foo ';
// Returns true

SELECT 'foo' LIKE 'foo ';
// Returns false

因此,请务必使用适当的操作符。

由于列上的排序规则为CASE INSENSITIVE,因此您不需要UPPER()功能。事实上,删除UPPER将允许MySQL利用列上的索引(使用列上的函数通常会否定索引的使用)。

 // With case insensitive collation
 SELECT 'FOO' = 'foo';
 // Returns true

 // LIKE will work the same
 SELECT 'FOO' LIKE 'foo';
 // Returns true

由于=LIKE会为您返回相同的结果,但我不知道问题是什么。

您还应该为连接中的所有列指定表名,以避免出现模糊列的可能性(如果您将来要向其他表添加类似的列),并且为了便于阅读:

SELECT employees.FirstName, employees.LastName,
    work.SponsorshipStatus, work.EnrollmentStatus, work.AdjudicationStatus
    FROM employees
    LEFT JOIN work
    ON employees.FirstName = work.FirstName
    AND employees.LastName = work.LastName;

但是,如果列不明确,则应该出错。