2012-03-24 37 views
13

Mam tabelę z kolumną phone, gdzie dane mogą zawierać spacje, kropki, łączniki lub znaki + między liczbami. muszę zrobić wyszukiwania z podobnym literowych które ignorują wszystkie te postacie, na przykład:Jak ignorować znaki w MYSQL SELECT LIKE% ...%

  • zapis może mieć telefon jako „+ 123-456 78,90”
  • zapytanie patrząc na „6789” lub dowolny kompletna lub niekompletna sekwencja odpowiednich cyfr w kolejności powinna wywołać ten zapis.

Niestety, nie mogę oczyścić oryginalnej tabeli, aby usunąć znaki nie będące cyframi i zrobić zwykły WYBIERZ LIKE% ...%.

MYSQL ma funkcje do zastępowania/usuwania znaków z ciągów, ale nie może znaleźć sposobu na ich użycie w zapytaniu z rozszerzonym typem LIKE.

Każda pomoc będzie doceniana.

+0

Który język jest językiem po stronie serwera? PHP? –

+1

To mówi, że mysql i Henry mówią o zapytaniach;) – Martijn

Odpowiedz

28

widzę dwa sposoby to zrobić:

  1. Jeśli pozwalają tylko kilka dodatkowych znaków niż można przygotować ciąg, który jest uproszczoną z tych dodatkowych znaków i użyć operatora jakbyś normalnie

    select * from phoneTable where replace(replace(phone, '+', ''), '-', '') LIKE '%123%' 
    

    oczywiście trzeba tyle zastąpić połączenia jak liczba dozwolonych dodatkowych znaków

  2. użyć wyrażeń regularnych, powiedzmy, Szukasz wzór 123

    select * from phoneTable where phone REGEXP '.*1[^0-9]*2[^0-9]*3' 
    
+0

Po dodaniu "% ..%" do pierwszej opcji, obaj wykonują to zadanie poprawnie. Bardzo dziękuję za pomoc. – Henry

+0

Masz rację, zapomniałem symboli wieloznacznych i nie próbowałem uruchamiać zapytań. Odpowiedź poprawiona. – Hari

+1

Domyślam się, że pierwsza opcja jest szybsza. –

4

miałem ten sam problem z numery części i niechcianych znaków. Moje rozwiązanie to

SELECT * FROM parts WHERE replace(partnumber, '-', '') LIKE '$searchterm%'; 
+3

jak ta odpowiedź różni się od akceptowanej? – Sp0T