客户端的标签由以下内容组成:
其最大大小必须为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次。你知道我怎样才能使这个查询更好,更有表现力吗?
发布于 2013-09-15 14:16:31
您可以将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;然而,这种微优化不太可能对您的应用程序产生任何影响。
https://stackoverflow.com/questions/18813326
复制相似问题