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
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
[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
Hi hvd, dzięki! – bimspramirez