将匹配的字符串移动到MySQL中的末尾
我正在做一个将匹配的字符串移动到MySQL中的末尾,mysql,sql,regex,string,string-matching,Mysql,Sql,Regex,String,String Matching,我正在做一个GROUP\u CONCAT以 Lastname1, Firstname1; Lastname2, Firstname2 在某些情况下,lastname还包含用曲线括号括起来的字符串-(和)。因为这些将显示在连接字符串的中间,所以我试图把它移到结尾。 到目前为止,我的解决方案是: GROUP_CONCAT( DISTINCT CASE WHEN UPPER(psn.surname) LIKE '%INACTIVE%' THEN CONCAT(TRIM(REP
GROUP\u 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
到目前为止,这是可行的,但它只查找特定的字符串,也有一些情况下,曲线括号内的字符串不是非活动的,我不想硬编码所有这些
那么基本上,我该如何把一根用曲线括号括起来的绳子移到绳子的末端呢。我想,
regex
是这个问题的最佳解决方案,但我不知道如何使用regex。Hmmm。类似的方法可能会奏效:
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
的表达式。这似乎有些过分。MySQL没有任何用于此目的的正则表达式函数。您必须使用LOCATE
、SUBSTR
和CONCAT
来执行此操作。您可能希望将其放入存储函数中。@Barmar不是我需要的REGEXP\u SUBSTR()
和REGEXP\u REPLACE()
吗?您使用的是MySQL 8.0吗?对于该版本,它们是新的。如果您对姓氏
使用不区分大小写的排序规则,则不需要使用UPPER()
。