Поиск текста между разделителями в MySQL - PullRequest
11 голосов
/ 29 сентября 2008

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

например. найдите foo в следующем

test 'esf: foo: bar

Итак, в приведенном выше примере я хочу вернуть foo, но все функции регулярного выражения возвращают только true | false Есть ли способ сделать это в MySQL

Ответы [ 11 ]

21 голосов
/ 29 сентября 2008

Вот, пожалуйста, приятель:

SELECT 
  SUBSTR(column, 
    LOCATE(':',column)+1, 
      (CHAR_LENGTH(column) - LOCATE(':',REVERSE(column)) - LOCATE(':',column))) 
FROM table

Да, понятия не имею, зачем вы это делаете, но это сработает.

Выполнив LOCATE, мы можем найти первое «:». Чтобы найти последний ':', обратного LOCATE нет, поэтому мы должны сделать это вручную, выполнив LOCATE (':', REVERSE (column)).

С индексом первого ':', числом символов от последнего ':' до конца строки и CHAR_LENGTH ( не используйте LENGTH () для этого ) , мы можем использовать небольшую математику, чтобы узнать длину строки между двумя экземплярами ':'.

Таким образом, мы можем выполнить SUBSTR и динамически выделять символы между двумя символами ':'.

Опять же, это брутто, но каждому свое.

4 голосов
/ 06 ноября 2014

Это должно работать, если два разделителя появляются только два раза в столбце. Я делаю что-то подобное ...

substring_index(substring_index(column,':',-2),':',1)
2 голосов
/ 29 сентября 2008

Я не знаю, есть ли у вас такие полномочия, но если вам придется выполнять такие запросы, возможно, пришло время перенормировать ваши таблицы и поместить эти значения в таблицу поиска.

2 голосов
/ 29 сентября 2008

Комбинация LOCATE и MID , вероятно, сработает.

Если значение "test 'esf: foo: bar" было в поле fooField :

MID( fooField, LOCATE('foo', fooField), 3);
1 голос
/ 25 февраля 2015
mid(col, 
    locate('?m=',col) + char_length('?m='), 
    locate('&o=',col) - locate('?m=',col) - char_length('?m=') 
)

Немного компактная форма, заменив char_length(.) на число 3

mid(col, locate('?m=',col) + 3, locate('&o=',col) - locate('?m=',col) - 3)

Я использовал следующие шаблоны: '?m=' и '&o'.

1 голос
/ 29 сентября 2008

При наличии только одного набора разделителей должно работать следующее:

SUBSTR(
    SUBSTR(fooField,LOCATE(':',fooField)+1),
    1,
    LOCATE(':',SUBSTR(fooField,LOCATE(':',fooField)+1))-1
 )
0 голосов
/ 29 июня 2017

Это выглядит элегантно для меня. Удалите все после n-го разделителя, поверните строку, удалите все после 1. разделителя, поверните назад.

select
  reverse(
    substring_index(
      reverse(substring_index(str,separator,substrindex)),
      separator,
      1)
  );

Например:

select
  reverse(
    substring_index(
      reverse(substring_index('www.mysql.com','.',2)),
      '.',
      1
    )
  );
0 голосов
/ 05 октября 2016

Это то, из чего я извлекаю (в основном, двоеточие ':' как разделитель, но некоторые исключения), как столбец theline255 в таблице loaddata255:

23856.409:0023:trace:message:SPY_EnterMessage (0x2003a) L"{#32769}"      [0081] WM_NCCREATE sent from self wp=00000000 lp=0023f0b0

Это код MySql (он быстро сделал то, что я хочу, и прямо вперед):

select 
time('2000-01-01 00:00:00' + interval substring_index(theline255, '.', 1) second) as hhmmss
, substring_index(substring_index(theline255, ':', 1), '.', -1) as logMilli
, substring_index(substring_index(theline255, ':', 2), ':', -1) as logTid
, substring_index(substring_index(theline255, ':', 3), ':', -1) as logType
, substring_index(substring_index(theline255, ':', 4), ':', -1) as logArea
, substring_index(substring_index(theline255, ' ', 1), ':', -1) as logFunction
, substring(theline255, length(substring_index(theline255, ' ', 1)) + 2) as logText
from loaddata255

и вот результат:

# LogTime, LogTimeMilli, LogTid, LogType, LogArea, LogFunction, LogText
'06:37:36', '409', '0023', 'trace', 'message', 'SPY_EnterMessage', '(0x2003a) L\"{#32769}\"      [0081] WM_NCCREATE sent from self wp=00000000 lp=0023f0b0'
0 голосов
/ 24 мая 2014

Вы можете использовать функцию подстроки / locate в 1 команде

вот учебник для мышей:

http://infofreund.de/mysql-select-substring-2-different-delimiters/

Команда, которая описывает их, должна искать вас:

** SELECT substr (text, Locate (':', text) + 2, Locate (':', text) - (Locate (':', text) +2)) ОТ testtable**

где text - текстовое поле, содержащее "test 'esf: foo: bar"

Так что foo может быть fooooo или fo - длина не имеет значения:).

0 голосов
/ 29 сентября 2008

Если вам известна позиция, из которой вы хотите извлечь данные, а не сами данные:

$colNumber = 2; //2nd position
$sql = "REPLACE(SUBSTRING(SUBSTRING_INDEX(fooField, ':', $colNumber),
                             LENGTH(SUBSTRING_INDEX(fooField, 
                                                    ':', 
                                                    $colNumber - 1)) + 1)";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...