2008-09-29 7 views
10

Próbuję wyodrębnić pewną część kolumny między ogranicznikami.Wyszukiwanie tekstu między ogranicznikami w MySQL

np. foo znaleźć w następującym

testowej „EFS: foo bar

więc w powyższym bym chciał wrócić foo, ale wszystkie funkcje regexp powrócić tylko true | false czy istnieje sposób, aby zrobić to w MySQL

Odpowiedz

18

Tu ya go, Pączek:

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

Yea, bez pojęcia, dlaczego to robisz, ale będzie to rade.

Wykonując LOCATE, możemy znaleźć pierwsze ":". Aby znaleźć ostatni ":", nie ma odwrotnego LOCATE, więc musimy zrobić to ręcznie, wykonując LOCATE (":", REVERSE (kolumna)).

z indeksem pierwszego „:”, liczba znaków od ostatniego „:” na końcu łańcucha, a CHAR_LENGTH (nie używać length() dla tego), możemy użyj małej matematyki, aby odkryć długość łańcucha między dwoma wystąpieniami ":".

W ten sposób możemy wykreślić SUBSTR i dynamicznie wyłuskać znaki między dwoma ":".

Znowu to jest wulgarne, ale każdemu jego własne.

+1

Całkiem piękny potwór. Dobra robota. –

+0

lol, gdyby dano mu szansę, zrujnowałoby Boże Narodzenie. –

+0

Co oznacza "nazwa" w LOCATE (":", nazwa)? –

2

Kombinacja LOCATE i MID prawdopodobnie zdziała.

Jeżeli wartość „test„EFS: foo bar” był w polu fooField:

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

nie wiem co foo jest, wiem tylko ograniczniki obejmujących,: –

+0

Will pole kiedykolwiek mieć więcej niż jednego zestawu delimters? A ogranicznikami są:, prawda? –

+0

To prawda. –

2

ja nie wiem, czy masz ten rodzaj władzy, ale jeśli masz aby wykonać takie kwerendy, może to być czas na renormalizację tabel i ich wartości w tabeli odnośników.

+3

Być może próbuje wyodrębnić dane, aby je znormalizować :-) –

+0

To prawda. Dobra decyzja. :) –

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

Z tylko jeden zestaw delimeters dodaje powinno działać:

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

Jeśli znasz położenie chcesz wyodrębnić ze w przeciwieństwie do tego, co same dane to:

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

można użyć podciąg/funkcję zlokalizowania w 1 komendy

tutaj jest tutorial myszy:

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

Komenda jak opisuje ich należy szukać u:

** SELECT substr (tekst, zlokalizuj (":", tekst) + 2, zlokalizuj (":", tekst) - (zlokalizuj (":", tekst) +2)) od testtable**

gdzie tekst jest polem tekstowym zawierającym " test "esf: foo: bar"

Tak foo może być fooooo lub fo - długość nie ma znaczenia :).

3

To powinno działać, jeśli dwa ograniczniki pojawiają się tylko dwa razy w kolumnie. Robię coś podobnego ...

substring_index(substring_index(column,':',-2),':',1) 
1
mid(col, 
    locate('?m=',col) + char_length('?m='), 
    locate('&o=',col) - locate('?m=',col) - char_length('?m=') 
) 

Trochę forma kompaktowa zastępując char_length(.) z numerem 3

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

wzory ja są wykorzystywane '?m=' i '&o'.

0

To co ja wydobycia od (głównie dwukropka „:” jako separatora ale pewnymi wyjątkami), a kolumny theline255 w tabeli loaddata255:

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

Jest to kod MySql (Szybko udało, czego chcę i jest prosto do przodu):

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 

i jest to wynik:

# 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

Ten wygląda mi elegancko. Rozbierz wszystkie po n-tym separatorze, obróć ciąg, usuń wszystko po 1. separatorze, obróć z powrotem.

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

Na przykład:

select 
    reverse(
    substring_index(
     reverse(substring_index('www.mysql.com','.',2)), 
     '.', 
     1 
    ) 
); 
Powiązane problemy