MySQL:如何使用 CASE 或 IF 匹配较短的列的长度?

Posted

技术标签:

【中文标题】MySQL:如何使用 CASE 或 IF 匹配较短的列的长度?【英文标题】:MySQL: How to use CASE or IF to match on the length of whichever column is shorter? 【发布时间】:2020-05-05 17:45:34 【问题描述】:

我想匹配名称列,但其中一些包含名字的昵称,所以我想做一些事情,我使用 substring_index 来查找名字并且哪个表的名字更短(例如 Zach vs Zachary)我匹配较短名字的长度。之后,我匹配他们姓氏的最后四个字母,我没有包括在下面。现在,它在 char_length 附近给了我一个错误。

SELECT a.name, b.name
FROM a, b
WHERE IF (
    a.name < b.name)
    THEN 
    a.name = SUBSTRING(b.name, 1, char_length(a.name))
ELIF (
    b.name < a.name)
THEN
    b.name = SUBSTRING(a.name, 1, CHAR_LENGTH(b.name))

【问题讨论】:

请提供样本数据和期望的结果。 必填链接:Falsehoods Programmers Believe About Names。 Bob、Tom、Dave、Bill 和 Sue 认为您的方法有缺陷。 今日提示:切换到现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读(和维护),并且在需要时更容易转换为外连接。 【参考方案1】:
SELECT CASE WHEN
   CHAR_LENGTH(a.name) < CHAR_LENGTH(b.name)
THEN
  SUBSTR(b.name, 1, CHAR_LENGTH(a.name))
ELSE
  SUBSTR(a.name, 1, CHAR_LENGTH(b.name))
END
FROM a, b

【讨论】:

【参考方案2】:

切换到现代、明确的JOIN 语法。

使用LIKE 两次,查找以b-names 开头的a-names,或以a-names 开头的b-names。

SELECT a.name, b.name
FROM a
JOIN b
  ON a.name like concat(b.name, '%') or b.name like concat(a.name, '%')

【讨论】:

以上是关于MySQL:如何使用 CASE 或 IF 匹配较短的列的长度?的主要内容,如果未能解决你的问题,请参考以下文章

mysql中case用法

如何使用 IF 或 Case 函数来汇总 GROUP_CONCAT 列?然后将其应用于原始数据表?

SQL语句中Case 的用法

mysql - ORDER BY 语句中的 IF...ELSE 或 CASE

MySQL的if,case语句使用总结

MySQL的if,case语句使用总结