2012-01-19 17 views
7

Mam kwerendę, którą muszę uruchomić na prawie 2000 ciągów, gdzie byłoby bardzo pomocne, aby móc wykonać listę, jak można z operatorem "IN", ale przy użyciu operacji porównania LIKE.Jak mogę użyć operatora LIKE na liście łańcuchów do porównania?

Na przykład chcę, aby sprawdzić, czy pet_name jest jak każdy z nich (ale nie dokładnie): barfy, Max, wąsy, mistrzu, wouldn big-D, Big D, Sally

Korzystanie like it” • Rozróżnianie wielkich i małych liter może mieć również podkreślenie zamiast myślnika. Lub przestrzeń. To będzie ogromny ból w tyłku, aby napisać dużą serię operatorów OR. Używam tego w MySQL 5.1.

W tym konkretnym przypadku szukam nazw plików, w których różnice są zwykle kreską lub znakiem podkreślenia, w którym przeciwny byłby.

+0

powiem, że podczas gdy czekałem tylko używane ciąg zastąpić funkcję w moim edytorze tekstowym na rozdzielana przecinkami lista nazw plików i dodawana w tekście "LUB LIKE" dla każdego z nich. Nie mam czasu na spalanie. – pthurmond

+0

Mimo że wybrałem inną trasę, nadal będę oglądać to pytanie i wybrać zwycięzcę. Kilka osób naprawdę zastanowiło się nad tą sprawą i dostarczyło fantastycznych informacji zwrotnych, które powinny zostać nagrodzone. Promuję również odpowiedzi, które wydają się dobre lub przynajmniej dobrze przemyślane. – pthurmond

Odpowiedz

3

Można zrobić coś takiego -

SELECT FIND_IN_SET(
    'bigD', 
    REPLACE(REPLACE('barfy,max,whiskers,champ,big-D,Big D,Sally', '-', ''), ' ', '') 
) has_petname; 
+-------------+ 
| has_petname | 
+-------------+ 
|   5 | 
+-------------+ 

To da niezerową wartość (> 0), jeśli istnieje pet_name szukamy.

Ale sugeruję, aby utworzyć tabelę petnames i używać SOUNDS LIKE funkcję porównać nazwy, w tym przypadku „bigD” będzie równa „bigD”, np:

SELECT 'bigD' SOUNDS LIKE 'big-D'; 
+---------------------------+ 
| 'bigD'SOUNDS LIKE 'big-D' | 
+---------------------------+ 
|       1 | 
+---------------------------+ 

przykładu:

CREATE TABLE petnames(name VARCHAR(40)); 
INSERT INTO petnames VALUES 
    ('barfy'),('max'),('whiskers'),('champ'),('big-D'),('Big D'),('Sally'); 

SELECT name FROM petnames WHERE 'bigD' SOUNDS LIKE name; 
+-------+ 
| name | 
+-------+ 
| big-D | 
| Big D | 
+-------+ 
+0

+1 hasn ' Słyszeliśmy o dźwiękach takich jak przed – mkk

+0

+1 dla interesującej koncepcji. Ale nie sądzę, że podążasz za tym, co próbuję osiągnąć (to albo po prostu nie podążam za twoją implementacją). Zasadniczo mam pliki, które mają pliki siostrzane, z którymi muszą być powiązane. Ale kiedy klient wygenerował wiele tych siostrzanych plików (zrobiło to wiele osób), niektóre zmiany formatów dokonywały się automatycznie lub ręcznie. Tak więc "bobs-green-80-hat.eps" czasami stało się "bobs-green_80-hat.eps.jpg", a innym razem stało się "BOBS-GREEN-80-HAT.EPS.JPG", w zależności od tego, kto to zrobił. – pthurmond

+0

Czy przechowujesz nazwy plików w tabeli? – Devart

1

Pierwszym krokiem jest umieszczenie wszystkich wartości statycznych w dowolnej tabeli tymczasowej, to byłby słownik odnośników.

SELECT * FROM Table t 
WHERE EXISTS (
      SELECT * 
      FROM LookupTable l 
      WHERE t.PetName LIKE '%' + l.Value + '%' 
      ) 
+0

Rigth, spudłowałem (dodałem to teraz). Wierzę, że głównym wyzwaniem dla OP było przetwarzanie wielu wpisów, wierzę, że on wie, jak zastosować 'LIKE', ale tak czy inaczej miałeś rację – sll

+0

Nie jestem pewien, czy podążam dwoma kontami, najpierw jak dostać to do tabeli temp (które ja może sprawdzić) i drugie, jak działa ta operacja. W szczególności wygląda na to, że w podzapytaniu dokonujesz porównania wartości z zapytania wywołującego bezpośrednio w tym podzapytaniu. Czy to w ogóle jest możliwe? – pthurmond

+0

Czy OP musiałby wpisywać wartości statyczne za pomocą symbolu wieloznacznego (np. Big_d), aby uwzględnić różne wartości (big-D, Big D, itp.) Takie jak opisane OP? Również potrzebne jest LCASE()? – JSuar

0

Skonfiguruj kolumnę zawierającą te 2000 wartości do wyszukiwania pełnotekstowego. Następnie możesz użyć funkcji wyszukiwania pełnotekstowego MySQL. Odnoszą się do ich docs

8

Do tego zadania Proponuję wykorzystanie RegExp capabilities in MySQL tak:

select * from EMP where name RLIKE 'jo|ith|der'; 

Jest to sprawa mecz nieczuły i uratuje od wielokrotności jak/lub warunków.

+0

Czy to zignoruje różnicę między myślnikiem a podkreślnikiem? – pthurmond

+0

Oczywiście można uruchomić to zapytanie, aby uzyskać takie zachowanie: 'wybierz * z EMP gdzie zamień (nazwa," - "," _ ") RLIKE 'jo | ith | der';' – anubhava

+2

To niezwykle przydatne. Skopiuj listę wyników z innego zapytania, zmień każdy podział linii na potok, a to zadziwiająco dobrze. – spsaucier

0

Zamiast tego można użyć REGEXP. To zadziałało jak urok dla mnie

pet_name regexp „barfy | max | wąsy | Champ | nazwać go”

Powiązane problemy