将匹配的字符串移到mysql中的结尾

dced5bon  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(312)

我在做一件事 GROUP_CONCAT 以下列格式显示名称

Lastname1, Firstname1; Lastname2, Firstname2

有时 lastname 还包含用曲线括号括起来的字符串- ( 以及 ) . 因为这些将显示在连接字符串的中间,所以我尝试将其移到末尾。
到目前为止,我的解决方案是:

GROUP_CONCAT(
  DISTINCT
    CASE
      WHEN UPPER(psn.surname) LIKE '%INACTIVE%' THEN CONCAT(TRIM(REPLACE(psn.surname, '(Inactive)', '')), ', ', psn.firstname, ' (Inactive)')
      ELSE CONCAT(psn.surname, ', ', psn.firstname)
    END
  ORDER BY
    CASE
      WHEN UPPER(psn.surname) LIKE '%INACTIVE%' THEN CONCAT(TRIM(REPLACE(psn.surname, '(Inactive)', '')), ', ', psn.firstname, ' (Inactive)')
      ELSE CONCAT(psn.surname, ', ', psn.firstname)
    END
  ASC
  SEPARATOR '; '
) AS contacts

到目前为止,这是可行的,但它只寻找一个特定的字符串,也有一些情况下,字符串内的弯曲括号不是 Inactive 我不想硬编码所有这些。
所以基本上,我该如何把一根用曲线括号括起来的绳子移到绳子的末端。我想是吧 regex 是这个问题的最佳解决方案,但我不知道如何使用regex。

ttvkxqim

ttvkxqim1#

嗯。像这样的方法可能有用:

GROUP_CONCAT(DISTINCT (CASE WHEN psn.surname LIKE '%(%'
                            THEN CONCAT(TRIM(SUBSTRING_INDEX(psn.surname, '(', 1)), ', ',
                                        psn.firstname, '('
                                        SUBSTRING_INDEX(psn.surname, '(', -1)
                                       )
                            ELSE CONCAT(psn.surname, ', ', psn.firstname)
                       END)
              ORDER BY psn.surname, psn.firstname ASC SEPARATOR '; '
            ) AS contacts

我没有重复这个表达式 order by . 这似乎太过分了。

相关问题