将匹配的字符串移到MySQL

时间:2018-05-30 19:52:10

标签: mysql sql regex string string-matching

我正在做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是解决这个问题的最佳方法,但我不知道如何使用正则表达式。

1 个答案:

答案 0 :(得分:0)

嗯。嗯。 。 。这样的事情可能有用:

df <- read.table(text =  
"ABBA01A ABBA01B ABBA02A ABBA02B ACRU01A ACRU01B ACRU02A ACRU02B 
1908      NA      NA      NA      NA      NA      NA      NA      NA           
1909      NA      NA      NA      NA      NA      NA      NA      NA          
1910      NA      NA      NA      NA      NA      NA      NA      NA         
1911      NA      NA      NA      NA      NA      NA      NA      NA      
1912      NA      NA      NA      NA      NA      NA      NA      NA      
1913      NA      NA      NA      NA      NA      NA      NA      NA",
header = TRUE, stringsAsFactors = FALSE)

我没有重复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 的表达式。这似乎有点矫枉过正。