客户的标签包括:
他的头衔(小姐/先生/夫人/女士),
他的名字,
他的姓。
其最大大小必须为20个字符:
如果标签大小大于20,则将名字缩减为带点的首字母(Nancy变为N.),
如果标签大小仍然大于20,则整个标签将被截断为20个字符。
我做到了:
SELECT
UPPER(
CASE WHEN
LENGTH(CONCAT(clientTitle, " ", clientFirstname, " ", clientSurname)) > 20
THEN
CONCAT(clientTitle, " ", CONCAT(SUBSTR(clientFirstname, 1, 1), "."), " ", clientSurname)
ELSE
CONCAT(clientTitle, " ", clientFirstname, " ", clientSurname)
END
) AS label
FROM Client
很有效,但我觉得不太好。连接语句写3次,在任何情况下都写2次。你知道我怎样才能使这个查询更好、更高效吗?
最佳答案
您可以将case
移到concat()
内,只需输入名字。
SELECT upper(concat(c.clientTitle, ' ',
(case when length(concat(c.clientTitle, ' ', c.clientFirstname, ' ', c.clientSurname)) > 20
then concat(left(c.clientFirstName, 1), '.')
else c.clientFirstName
end), ' ',
c.clientSurname
)
) AS label
FROM Client c;
我还更改了长度计算,删除了两个空格,并将
20
更改为20 - 2
(公式的意思是提醒两个空格已丢失)。使用表别名也使代码更可读。而且,我不会担心一种方法与另一种方法的性能。短字符串上的操作通常不是性能的驱动因素。
编辑:
如果您关心的是具体的连接,那么对length执行多个调用:
SELECT upper(concat(c.clientTitle, ' ',
(case when length(c.clientTitle) + length(c.clientFirstname) + length(c.client_Surname) > 20 - 2
then concat(left(c.clientFirstName, 1), '.')
else c.clientFirstName
end), ' ',
c.clientSurname
)
) AS label
FROM Client c;
但是,这种微观优化不太可能对您的应用程序产生任何影响。
关于mysql - 条件SELECT中的重复串联,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18813326/