Переместить совпавшую строку в MySQL

0

Я делаю 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
    MySQL не имеет функций регулярного выражения, которые были бы полезны для этого. Вы должны использовать LOCATE , SUBSTR и CONCAT чтобы сделать это.
  • 0
    Вы могли бы хотеть поместить это в сохраненную функцию.
Показать ещё 4 комментария
Теги:
string
string-matching

1 ответ

0

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

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. Это похоже на перебор.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню