Mysql
 sql >> Baza danych >  >> RDS >> Mysql

3 sposoby na znalezienie wierszy zawierających wielkie litery w MySQL

Oto trzy opcje zwracania wierszy zawierających wielkie litery w MySQL.

Przykładowe dane

Załóżmy, że mamy tabelę z następującymi danymi:

SELECT c1 FROM t1;

Wynik:

+----------------+
| c1             |
+----------------+
| CAFÉ           |
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
| JB 007         |
| 007            |
| NULL           |
|                |
| É              |
| É 123          |
| é              |
| é 123          |
| ø              |
| Ø              |
+----------------+

Możemy użyć następujących metod, aby zwrócić wiersze zawierające duże litery.

Opcja 1:Porównaj z LOWER() Ciąg

Możemy użyć LOWER() funkcja do porównania oryginalnej wartości z jej odpowiednikiem małymi literami:

SELECT c1 FROM t1
WHERE CAST(LOWER(c1) AS BINARY) <> CAST(c1 AS BINARY);

Wynik:

+----------------+
| c1             |
+----------------+
| CAFÉ           |
| Café           |
| eCafé          |
| James Bond 007 |
| JB 007         |
| É              |
| É 123          |
| Ø              |
+----------------+

Używając nie równego (<> ) operator (możesz alternatywnie użyć != zamiast <> jeśli wolisz), zwracamy tylko te wiersze, które różnią się od ich odpowiedników pisanych małymi literami. Powodem, dla którego to robimy, jest to, że jeśli wartość jest taka sama jak jej odpowiednik małymi literami, to na początku była już mała (i nie chcemy jej zwracać).

Domyślnie MySQL przeprowadza wyszukiwanie bez rozróżniania wielkości liter, dlatego używam funkcji CAST() funkcja rzutowania wartości na format binarny w celu wyszukiwania z uwzględnieniem wielkości liter.

Możliwe jest również użycie BINARY operator do rzutowania wartości na binarny, ale ten operator jest przestarzały w MySQL 8.0.27 i może zostać usunięty w przyszłej wersji.

W każdym razie tak wygląda kod przy użyciu BINARY operator:

SELECT c1 FROM t1
WHERE BINARY LOWER(c1) <> BINARY c1;

Można to również zrobić w ten sposób:

SELECT c1 FROM t1
WHERE BINARY(LOWER(c1)) <> BINARY(c1);

Oto wyniki, które otrzymuję z obu tych elementów podczas uruchamiania kodu w MySQL 8.0.27:

+----------------+
| c1             |
+----------------+
| CAFÉ           |
| Café           |
| eCafé          |
| James Bond 007 |
| JB 007         |
| É              |
| É 123          |
| Ø              |
+----------------+
8 rows in set, 2 warnings (0.00 sec)

A kiedy pokazuję ostrzeżenia:

SHOW WARNINGS;

Wynik:

+---------+------+----------------------------------------------------------------------------------------------+
| Level   | Code | Message                                                                                      |
+---------+------+----------------------------------------------------------------------------------------------+
| Warning | 1287 | 'BINARY expr' is deprecated and will be removed in a future release. Please use CAST instead |
| Warning | 1287 | 'BINARY expr' is deprecated and will be removed in a future release. Please use CAST instead |
+---------+------+----------------------------------------------------------------------------------------------+

Opcja 2:Porównaj z rzeczywistymi znakami

Inną opcją jest użycie REGEXP operator ze wzorcem wyrażenia regularnego, który jawnie zawiera każdy znak wielkiej litery, który chcemy dopasować:

SELECT c1 FROM t1
WHERE CAST(c1 AS BINARY) REGEXP CAST('[ABCDEFGHIJKLMNOPQRSTUVWXYZ]' AS BINARY);

Wynik:

+----------------+
| c1             |
+----------------+
| CAFÉ           |
| Café           |
| eCafé          |
| James Bond 007 |
| JB 007         |
+----------------+

Tym razem zwracanych jest mniej wierszy niż w poprzednich przykładach. To dlatego, że nie określiłem znaków takich jak É i Ø , które zostały zwrócone w tych przykładach. Nasz wynik zawiera É ale ten wiersz został zwrócony tylko dlatego, że zawiera również inne wielkie litery, które wykonaj dopasuj.

Dlatego musisz upewnić się, że masz wszystkie prawidłowe znaki, jeśli użyjesz tej opcji.

Opcja 3:Porównaj z zakresem znaków

Innym sposobem na to jest określenie zakresu wielkich liter, które chcemy dopasować:

SELECT c1 FROM t1
WHERE CAST(c1 AS BINARY) REGEXP CAST('[A-Z]' AS BINARY);

Wynik:

+----------------+
| c1             |
+----------------+
| CAFÉ           |
| Café           |
| eCafé          |
| James Bond 007 |
| JB 007         |
+----------------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:wybierz losowy wpis, ale waż w stosunku do niektórych wpisów

  2. Alternatywy MySQL Workbench — zarządzanie użytkownikami bazy danych ClusterControl

  3. phpMyAdmin zgłasza #2002 nie można zalogować się do serwera mysql phpmyadmin

  4. Jak przekonwertować z BLOB na TEXT w MySQL?

  5. Kolejność Mysql według określonych wartości ID