条件SELECT中的重复连接

时间:2013-09-15 14:10:59

标签: mysql sql

客户的标签由以下内容组成:

  • 他的头衔(Miss / Mr / Mrs / Ms),
  • 他的名字,
  • 他的姓。

最大尺寸必须为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次。您是否知道如何使此查询更好,更高效?

1 个答案:

答案 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;

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