Поиск текста между разделителями в MySQL

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

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

test 'esf: foo: bar

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

Ответ 1

Здесь ya go, bud:

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

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

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

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

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

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

Ответ 2

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

substring_index(substring_index(column,':',-2),':',1)

Ответ 3

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

Если значение "test" esf: foo: bar "находилось в поле fooField:

MID( fooField, LOCATE('foo', fooField), 3);

Ответ 4

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

Ответ 5

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

SUBSTR(
    SUBSTR(fooField,LOCATE(':',fooField)+1),
    1,
    LOCATE(':',SUBSTR(fooField,LOCATE(':',fooField)+1))-1
 )

Ответ 6

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'.

Ответ 7

select mid(col from locate(':',col) + 1 for 
locate(':',col,locate(':',col)+1)-locate(':',col) - 1 ) 
from table where col rlike ':.*:';

Ответ 8

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

$colNumber = 2; //2nd position
$sql = "REPLACE(SUBSTRING(SUBSTRING_INDEX(fooField, ':', $colNumber),
                             LENGTH(SUBSTRING_INDEX(fooField, 
                                                    ':', 
                                                    $colNumber - 1)) + 1)";

Ответ 9

Это разрешает только ограничители, которые имеют один символ в длину, поскольку более широкий подход к разделителям использует следующую статью в качестве руководства: http://www.electrictoolbox.com/mysql-select-locate-substring/

Ответ 10

Это то, что я извлекаю из (в основном двоеточие: "как разделитель, но некоторые исключения" ), в качестве столбца 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'

Ответ 11

Этот выглядит элегантно для меня. Стрите все после 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
    )
  );

Ответ 12

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

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

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

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

** SELECT substr (текст, Locate (':', text) + 2, Locate (':', text) - (Найти (':', текст) +2)) FROM testtable**

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

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