Я делаю 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 - лучшее решение этой проблемы, но я не знаю, как использовать регулярное выражение.
Возможно, вы захотите поместить его в сохраненную функцию.
@Barmar Разве мне не нужны REGEXP_SUBSTR() и REGEXP_REPLACE()?
Вы используете MySQL 8.0? Они новички в этой версии.
@Barmar Ну ладно. У нас сейчас 5,7. Спасибо за ваши предложения. Я посмотрю на них.
Если вы используете сортировку без учета регистра для surname, вам не нужно использовать UPPER().






Хм . . . что-то вроде этого может сработать:
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.