#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/53. Теперь я понимаю. Большое вам спасибо за подробную помощь и за быстрый ответ! Это очень ценится.