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 匹配较短的列的长度?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 IF 或 Case 函数来汇总 GROUP_CONCAT 列?然后将其应用于原始数据表?