客户的标签包括:
他的头衔(小姐/先生/夫人/女士),
他的名字,
他的姓。
其最大大小必须为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/

10-15 00:06
查看更多