Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将匹配的字符串移动到MySQL中的末尾_Mysql_Sql_Regex_String_String Matching - Fatal编程技术网

将匹配的字符串移动到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()