客户的标签由以下内容组成:
最大尺寸必须为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次。您是否知道如何使此查询更好,更高效?
答案 0 :(得分:1)
您可以移动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
来更改长度计算(该公式表示提示缺少两个空格)。表别名的使用也使代码更具可读性。
而且,我不担心一种方法与另一种方法的表现。短字符串操作通常不是性能的驱动因素。
编辑:
如果您的关注是特定连接,那么请多次调用长度:
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;
但是,这种微观优化不太可能对您的应用程序产生任何影响。