Поиск текста между разделителями в 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 - длина не имеет значения:).