Переместить совпадающую строку в конец в MySQL

Я делаю 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 - лучшее решение этой проблемы, но я не знаю, как использовать регулярное выражение.

В MySQL нет полезных для этого функций регулярных выражений. Для этого вы должны использовать LOCATE, SUBSTR и CONCAT.

Barmar 30.05.2018 21:54

Возможно, вы захотите поместить его в сохраненную функцию.

Barmar 30.05.2018 21:56

@Barmar Разве мне не нужны REGEXP_SUBSTR() и REGEXP_REPLACE()?

Patrick Gregorio 30.05.2018 21:56

Вы используете MySQL 8.0? Они новички в этой версии.

Barmar 30.05.2018 21:57

@Barmar Ну ладно. У нас сейчас 5,7. Спасибо за ваши предложения. Я посмотрю на них.

Patrick Gregorio 30.05.2018 21:58

Если вы используете сортировку без учета регистра для surname, вам не нужно использовать UPPER().

Rick James 01.06.2018 19:36
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
6
47
1

Ответы 1

Хм . . . что-то вроде этого может сработать:

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. Это кажется излишним.

Другие вопросы по теме