Извлечение данных между круглыми скобками, которые всегда имеют разную длину

#mysql #sql #substring

#MySQL #sql #подстрока

Вопрос:

Я столкнулся с проблемой и, похоже, нигде не могу найти правильное решение. Я хотел бы извлечь данные из столбца, который никогда не будет одинаковой длины, но всегда будет в круглых скобках. Я пробовал разные операторы SUBSTR и LOCATE, но безрезультатно.

Таблица: FiguresLog

 |UpdateDate|    |Description|
|2014-01-01|    |(10.0.600.1) Various descriptions follow|
|2014-01-02|    |(192.168.10.100) Various descriptions follow|
  

Мне нужно иметь возможность извлекать (создавать новую таблицу / поле), содержащую IP-адреса в круглых скобках, и, как я уже говорил, они всегда будут разной длины.

Ответ №1:

Вы можете сделать это с помощью регулярных выражений. Но, если в строке есть только одно заключенное в скобки выражение, это должно сработать для вас:

 select substring_index(substring_index(description, ')', 1), '(', -1) as IpAddress
  

Комментарии:

1. В вашем SQL-операторе есть ошибка. Второе count должно быть -1 , а не 2 .

Ответ №2:

Вы можете сделать все это, используя LOCATE и SUBSTR . Из-за того, как SUBSTR принимает позицию и длину, математика становится немного странной. Надеюсь, этот пример прояснит:

 SELECT 
  SUBSTR(text, ip_start, ip_len) AS ip_addr
FROM
(
  SELECT text,
    (LOCATE('(', text)   1) AS ip_start,
    (LOCATE(')', text) - (LOCATE('(', text)   1)) AS ip_len
  FROM test
) temp;
  

Обратите внимание, что это (LOCATE('(', text) 1) повторяется. Поэтому 1 мы не включаем круглые скобки в подстроку.
Фактическое вычисление для ip_len ip_len = end_paren_pos - ip_start , но мы не можем создавать и выбирать из ip_start в одном запросе.

Пример в действии: http://sqlfiddle.com /#!2/2845e/3

Комментарии:

1. Я выполнил приведенную ниже инструкцию, и она возвращает все пустые строки. Есть какие-нибудь идеи, почему и где я напортачил? ВЫБЕРИТЕ SUBSTR(Description, ip_start, ip_len) КАК ip_addr ИЗ ( ВЫБЕРИТЕ Description, (LOCATE(‘(‘, Description) 1) КАК ip_start, (LOCATE(‘)’, Description) — (LOCATE(‘(‘, Description) 1)) КАК ip_len ИЗ sl.figureslog ) temp;

2. Вы вложили один уровень слишком глубоко. Ваш самый внутренний запрос FROM sl.figureslog не включает Description , но следующий уровень вложенности пытается выбрать его. Вот обновленная скрипка: sqlfiddle.com /#!2/9cd8c1/5

3. Теперь я понимаю. Большое вам спасибо за подробную помощь и за быстрый ответ! Это очень ценится.