2010-04-25 9 views
26

Jaki jest najlepszy sposób uruchomienia zapytania, aby ignorowane były spacje w polach? ? Na przykład, następujące pytania:Zapytanie ignorujące spacje

SELECT * FROM mytable WHERE username = "JohnBobJones"  
SELECT * FROM mytable WHERE username = "John Bob Jones" 

byłoby znaleźć następujące dane:

John Bob Jones 
JohnBob Jones 
JohnBobJones 

używam PHP lub Python, ale myślę, że to nie ma znaczenia.

+1

PostgreSQL lub MySQL? Najlepsze rozwiązanie może być inne w każdym przypadku. Próba napisania czegoś, co działa w obu przypadkach, zwykle jest receptą na powolne zapytanie. –

Odpowiedz

54
SELECT * FROM mytable 
    WHERE REPLACE(username, ' ', '') = REPLACE("John Bob Jones", ' ', '') 
+0

działa również doskonale w firebird2.5. – lordvlad

+0

Można również użyć funkcji REPLACE() z operatorami LIKE i symbolami wieloznacznymi. Na przykład: SELECT * FROM mytable REPLACE (nazwa użytkownika, '', '') LIKE REPLACE ("John B%", "',' '); –

-1

Jednym ze sposobów jest użycie LIKE i WildCards do budowania kryteriów zapytania. Coś jak:

SELECT * FROM mytable GDZIE nazwa użytkownika LIKE 'John Bob Jones';

+15

To będzie niepoprawnie pasować do 'John Paul Bob Jones'. – SLaks

+0

Ta odpowiedź jest błędna. –

10

To zależy. Jeśli nie zależy Ci na dobrej wydajności, możesz zrobić wiele rzeczy, ale większość z nich będzie powolna. Może to dla ciebie w porządku, ale zostawię tę odpowiedź tutaj, na wypadek, gdyby inne osoby potrzebowały szybkiego rozwiązania.

Jeśli chcesz bardzo szybko działać, powinieneś zaindeksować ciąg bez spacji w bazie danych. W PostgreSQL możesz create an index on a function. Możesz użyć tego do utworzenia indeksu w kolumnie z zastąpionymi spacjami pustym łańcuchem. Zaletą tej metody jest to, że nie wymaga ona konserwacji poza tworzeniem indeksu.

W MySQL nie można tego zrobić, więc najprostszym sposobem jest skopiowanie danych w bazie danych - raz ze spacjami i raz bez. Użyj kolumny bez spacji w klauzuli WHERE, ale oryginalnej kolumny na liście kolumn SELECT. Wymaga to większej konserwacji, ponieważ kolumny muszą być zsynchronizowane. Możesz to zrobić za pomocą logiki aplikacji lub wyzwalaczy bazy danych.

+0

Dobra sprawa, właśnie wypróbowałem zamiennik mySQL w wyszukiwaniu kodu pocztowego i wow ... jest wolny ... dzięki za wskazówkę! – Ford

1

TRY TO:

SELECT * FROM mytable WHERE username =REPLACE("John Bob Jones", ' ', '') 
+0

Nie uda się znaleźć 'JohnBob Jones' – Alan

2

Proponowane rozwiązanie wygląda bardzo dobrze, ale jest straszne dla wydajności, jeśli jest to możliwe, ograniczyć kwerendy z czymś takim

select * from mojatabela gdzie nazwa_użytkownika jak John % 'i REPLACE (nazwa użytkownika,' ',' ') = REPLACE ("John Bob Jones", "', '')

Możesz również użyć REGEXP.

SELECT * FROM mojatabela gdzie nazwa_użytkownika regexp '^ Johna * * Boba Jonesa

I pamiętaj, wydajność, praca w Gdzie są ogólnie zły pomysł.

Spójrz na http://dev.mysql.com/doc/refman/5.7/en/pattern-matching.html

0

często chcemy aby wyszukać tekst, niezależnie od liczby miejsc, białej przestrzeni i liter.

Po prostu przycinaj, wstawiaj małe litery i zamieniaj wszystkie wielopunktowe znaki bez słów na jedną spację.

SELECT regexp_replace(trim(lower('Here is    a   long    text    , with   many     white spaces   AND    different     character    sensitive')),'\W+',' ','g') t 

zwrot: tutaj jest długi tekst z wielu białych plam i inny charakter wrażliwych

Oto użycie wyszukiwania. Ważna jest tylko kolejność słów, nic więcej. I to jest piękne.

select * from (
SELECT regexp_replace(trim(lower('Here is    a   long    text    , with   many     white spaces   AND    different     character    sensitive')),'\W+',' ','g') t 
) as o 
where t= regexp_replace(trim(lower('Here is a LonG  TEXT , with   mANY white ^ spaces   AND   different character    sensiTive')),'\W+',' ','g') 

zwrot: tutaj jest długi tekst z wielu białych plam i inny charakter wrażliwych

śmieci i śmieci w danych w zapytaniu, ale nadal znajduje się w prawo.