2015-12-15 10 views
6

Dzień dobryDlaczego to zapytanie regularne nie zwraca żadnych wyników?

mam pole, które mają wiersze wyglądające jak

BBB-888-8557ZZV-003.XYZ 
BBB-999-8787ZZV-00D.XYZ 

Muszę znaleźć (i wymienić po I potwierdził, że moje select poprawne wierszy :)) wszystkich rekordów pasujących regex :

/-\d\d[A-Z]/g 

Stąd wszystkie pola, które mają znak minus, po którym następują dwie cyfry, po których następuje litera alfabetu.

Muszę również odfiltrować pola, które zawierają 999.

Próbowałem następujące SQL, ale nie zwraca żadnych wyników:

SELECT * 
FROM `track` 
WHERE (
pod LIKE "BBB-999%" 
AND pod 
REGEXP '/-\d\d[A-Z]/g' 
) 

Ponadto, co będzie szybkie dlaczego zastąpić wszystkich tych dziedzinach, gdy zostaną uznane za:

BBB-999-8787ZZV-_MARK_D.XYZ 
+1

Dałem wam rozwiązanie, które może poradzić sobie z ciągów dowolna długość. Proszę spojrzeć, jeśli masz szansę, dzięki. –

Odpowiedz

3

numerów w mysql shouls być dopasowane tak, jak [0-9] or [[:digit:]]
\d nie będzie działać zgodnie z oczekiwaniami.link

try;

SELECT * 
FROM `track` 
WHERE 
pod LIKE "BBB-999%" and 
pod REGEXP '\-[0-9]{2}[A-Z]{1}' 

lub

SELECT * 
FROM `track` 
WHERE 
pod LIKE "BBB-999%" and 
pod REGEXP '\-[[:digit:]]{2}[A-Z]{1}' 

sql fiddle demo

aktualizacji pola o -00[A-Z].XYZ z -MARK[A_Z].XYZ

  1. Następnie długość strln g jest zmienna (z komentarzem)
  2. ostatnie 8 znaków może być \-[0-9]{3}.XYZ lub \-[0-9]{2}[A-Z]{1}.XYZ

try:

UPDATE `track` 
SET `pod` = concat(reverse(substr(reverse(`pod`) from 8)), 'MARK', substr(`pod` from -5)) 
WHERE 
`pod` LIKE "BBB-999%" and 
`pod` REGEXP '\-0{2}[A-Z]{1}'; 

sql fiddle demo

+0

Dzięki Praveen, działa to w 100% Jak mogę teraz wymienić wszystkie mecze 00 [A-Z] na _MARK_ [A-Z] w tabeli? – georgelappies

+0

Czy wartość 'pod' to dane o stałej długości z wzorem' xxx-xxx-xxxxxxx-xxx.xxx'? – Praveen

+0

Cześć Praveen, nie, nie jest. Zawsze zaczyna się od BBB-999-, a następnie będzie mieć kombinację cyfr i liter, a następnie "\ - [0-9] {3}" lub "\ - [0-9] {2} [AZ] {1 } "a następnie .XYZ Muszę zastąpić wszystkie 00 w tych, które wyszukuje twoje wyrażenie z _MARK_ Hope this sens. – georgelappies

3

Ty może użyć funkcji CONCAT(), aby uzyskać zamiennik w danych wyjściowych po ograniczeniu zapytania.

SELECT CONCAT(SUBSTRING(pod, 1, LENGTH(pod) - LOCATE('-', REVERSE(pod)) + 1), 
       '_MARK_D.XYZ') 
FROM `track` 
WHERE 
(
    pod LIKE "BBB-999%" 
    AND pod REGEXP '-[0-9][0-9][A-Z]' 
) 

Z jakiegoś powodu, musiałem użyć [0-9] w regex MySQL aby zmusić go do pracy.

Kliknij poniższy odnośnik do uruchomionego demo:

SQLFiddle

Jeśli chcesz faktycznie zmienić wartości w kolumnie pod można spróbować UPDATE:

UPDATE `track` 
SET pod = CONCAT(SUBSTRING(pod, 1, LENGTH(pod) - LOCATE('-', REVERSE(pod)) + 1), 
       '_MARK_D.XYZ') 
WHERE 
(
    pod LIKE "BBB-999%" 
    AND pod REGEXP '-[0-9][0-9][A-Z]' 
) 
+1

Mam to teraz działa. Sztuką jest użycie '[0-9]' do reprezentowania dowolnej liczby w wyrażeniu regularnym. Proszę spróbuj SQL Fiddle do obsługi klienta. –

+0

Hi @ timelewieneleisen, dziękuję, że to działa teraz, Jak mogę zastąpić wartości znalezione przez select wewnątrz rzeczywistej tabeli, a nie tylko mieć to wyświetlane na wyjściu? – georgelappies

Powiązane problemy