2013-12-13 77 views
5

Powiedzmy Mam tabeli:SQL: Dlaczego LIKE nie działa, jeśli używana jest klasa znaków [0-9]?

Aktualna tabela:

title_id  title_name    title_qty 
    1  A.I. Artificial Intelligence  2 
    2  Batman Begins     40 
    3  2012        7 
    4  101 Dalmatians     23 
    5  Act of Valor      1 
    6  Batman       50 
    7  20 Million Miles to Earth  340 

chciałbym mieć moc:

pożądany wynik:

title_id  title_name    title_qty title_char 
     4   101 Dalmatians    23   # 
     7   20 Million Miles to Earth  340   # 
     3    2012     7   # 
     1   A.I. Artificial Intelligence 2   A 
     5   Act of Valor     1   A 
     6   Batman      50   B 
     2   Batman Begins     40   B 

Na podstawie tego, co przeczytałem tutaj w Stack Overflow, najszybszy sposób na chec k, jeśli znak jest liczbą jest użycie jak '[0-9]%' więc wymyśliłem

Zapytanie:

SELECT *, CASE WHEN LEWO (title_name, 1), jak '[0-9]%', a następnie "#" ELSE LEWO (title_name 1) koniec, jak title_char Z kolejnością PRZEZ title_name

wyjściowa:

title_id  title_name    title_qty title_char 
    4   101 Dalmatians    23   1 
    7   20 Million Miles to Earth  340   2 
    3    2012     7   2 
    1   A.I. Artificial Intelligence 2   A 
    5   Act of Valor     1   A 
    6   Batman      50   B 
    2   Batman Begins     40   B 

Jak pokazano powyżej, nie działa w ogóle. Ale jeśli zmienię LIKE pasujące do pojedynczej cyfry, to działa:

SELECT *, CASE WHEN LEWO (title_name, 1) LIKE '1%' potem "#" ELSE LEWO (title_name, 1) END jako title_char od tytułu ORDER BY title_name

title_id  title_name    title_qty title_char 
    4   101 Dalmatians    23   # 
    7   20 Million Miles to Earth  340   2 
    3    2012     7   2 
    1   A.I. Artificial Intelligence 2   A 
    5   Act of Valor     1   A 
    6   Batman      50   B 
    2   Batman Begins     40   B 

I początkowo myślałem, że to nie działa, ponieważ moje zapytanie jest trochę skomplikowane, więc zrobiłem prosty wybrania miejsca. LIKE jest dodawane po WHERE.

Brak wyjścia (gdy nie powinno być trzy):

SELECT * FROM title WHERE title_name LIKE '[0-9]%' ORDER BY title_name 

działa zgodnie z oczekiwaniami:

SELECT * FROM title WHERE title_name LIKE '1%' ORDER BY title_name 

SELECT * FROM title WHERE title_name LIKE '2%' ORDER BY title_name 

Zgodnie z dokumentacją SQL

znaków klasa "[...]" pasuje do dowolnego znaku w nawiasach. Na przykład "[abc]" pasuje do "a", "b" lub "c". Aby nazwać zakres znaków , użyj myślnika. "[A-z]" pasuje do dowolnej litery, podczas gdy "[0-9]" dopasowuje dowolną cyfrę.

Ktoś wie, dlaczego to nie działa, jeśli użyłeś klasy postaci [0-9]? Jako początkujący, proszę mnie poprawić, jeśli się mylę. Ale jestem ciekawy, dlaczego działa, jeśli używam LIKE "1%" lub dowolnej cyfry, podczas gdy LIKE "[0-9]%" nie da żadnego wyniku? Dokumentacja mówi, że powinna pasować do dowolnej cyfry, prawda? Jeśli rzucanie go jako liczba całkowita jest wymaganiem, to nie powinno działać na wszystkich moich testach, prawda?Ponieważ nie rzuciłem go przed wykonaniem porównania LIKE.

SQL skrzypce:http://sqlfiddle.com/#!2/492906/7

+1

Edytowałem pytanie ... Wystarczy dodać, że jest to zapytanie, które może wytworzyć właściwe wyjście, użyłem RLIKE: SELECT *, CASE WHEN LEFT (nazwa tytułu, 1) RLIKE '[0-9]' THEN "# "ELSE LEFT (title_name, 1) END as title_char FROM title ORDER BY title_name – bimspramirez

+0

[Podana dokumentacja] (http://dev.mysql.com/doc/refman/5.5/en/pattern-matching.html) dotyczy 'RLIKE', a nie' LIKE', więc wydaje mi się to poprawne. W innych dialektach SQL '[...]' jest akceptowane przez 'LIKE', ale (podobno) nie w MySQL. – hvd

+0

Hi hvd, dzięki! – bimspramirez

Odpowiedz

5

The documentation jest nieco mylące. Mam nadzieję, że ostrożny Wycinanie może uczynić go bardziej zrozumiałym:

MySQL SQL zapewnia standardowy wzór pasujący jak również formę wzór pasujący

[...]

SQL wzór dopasowanie pozwala na wykorzystanie „ _ "aby dopasować dowolny pojedynczy znak i" % ", aby dopasować dowolną liczbę znaków (w tym zero znaków). W MySQL wzorce SQL domyślnie nie uwzględniają wielkości liter. Niektóre przykłady są tutaj pokazane. Nie używasz = lub <>, gdy używasz wzorców SQL; zamiast tego użyj operatorów porównania: LIKE lub NOT LIKE.

[...]

Drugi rodzaj Pattern Matching dostarczane przez MySQL używa rozszerzonych wyrażeń regularnych. Podczas testowania dopasowania dla tego typu wzoru należy użyć operatorów REGEXP i NOT REGEXP (lub RLIKE i NOT RLIKE, które są synonimami).

[...]

Klasa znaków „[...]” dopasowuje dowolny znak w nawiasach. Na przykład "[abc]" pasuje do "a", "b" lub "c". Aby nazwać zakres znaków, użyj myślnika. "[a-z]" pasuje do dowolnej litery, a "[0-9]" oznacza dowolną cyfrę.

Ponieważ to ostatnie zdanie jest pod „innego typu dopasowywania wzorców”, to odnosi się tylko do RLIKE że już znalazł, nie LIKE.

+1

Cześć dzięki hvd! Byłem zdezorientowany. Prawdopodobnie dlatego, że znalazłem post w Stack Overflow polecający LIKE [0-9] do sprawdzania, czy postać jest cyfrą, więc pomyślałem, że to zadziała. Dzięki, teraz wszystko jest jasne! Przepraszam, jeśli moje pytanie jest takie proste i głupie, daj mi znać, czy powinno zostać usunięte. W każdym razie, dzięki jeszcze raz dużo się tutaj uczę! – bimspramirez

+1

Wszystko jest proste i głupie, kiedy już wiesz dlaczego. :) Nie martw się o to, jest to bardzo dobre pytanie. – hvd