1

客户的标签由以下部分组成:

  • 他的头衔(小姐/先生/夫人/女士),
  • 他的名字,
  • 他的姓。

它的最大大小必须是 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 次。你知道我怎样才能让这个查询更好、更高效吗?

4

1 回答 1

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;

但是,此类微优化不太可能对您的应用程序产生任何影响。

于 2013-09-15T14:16:31.397 回答