sql >> Database teknologi >  >> RDS >> Mysql

3 måder at finde rækker, der indeholder små bogstaver i MySQL

Her er tre muligheder for at returnere rækker, der indeholder små bogstaver i MySQL.

Eksempel på data

Antag, at vi har en tabel med følgende data:

SELECT c1 FROM t1;

Resultat:

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

Vi kan bruge følgende metoder til at returnere de rækker, der indeholder små bogstaver.

Mulighed 1:Sammenlign med UPPER() Streng

Vi kan bruge UPPER() funktion til at sammenligne den oprindelige værdi med dens ækvivalent med store bogstaver:

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

Resultat:

+----------------+
| c1             |
+----------------+
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
| é              |
| é 123          |
| ø              |
+----------------+

Ved at bruge ikke lig med (<> ) operator (du kan alternativt bruge != i stedet for <> hvis du foretrækker det), returnerer vi kun de rækker, der er forskellige fra deres store bogstaver. Grunden til, at vi gør dette, er, at hvis en værdi er den samme som dens store bogstaver, så var den allerede store bogstaver til at begynde med (og vi ønsker ikke at returnere den).

Som standard udfører MySQL en søgning uden store og små bogstaver, og derfor bruger jeg CAST() funktion til at caste værdierne til binær for at få en søgning, der skelner mellem store og små bogstaver.

Det er også muligt at bruge BINÆR operator for at caste værdien til binær, men denne operator er forældet fra og med MySQL 8.0.27, og den kan blive fjernet i en fremtidig udgivelse.

Under alle omstændigheder er det sådan, koden ser ud, når du bruger BINARY operatør:

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

Det kan også gøres sådan her:

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

Her er de resultater, jeg får fra begge disse, når jeg kører koden i MySQL 8.0.27:

+----------------+
| c1             |
+----------------+
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
| é              |
| é 123          |
| ø              |
+----------------+

Og når jeg viser advarslerne:

SHOW WARNINGS;

Resultat:

+---------+------+----------------------------------------------------------------------------------------------+
| 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 |
+---------+------+----------------------------------------------------------------------------------------------+

Mulighed 2:Sammenlign med de faktiske tegn

En anden mulighed er at bruge REGEXP operator med et regulært udtryksmønster, der eksplicit inkluderer hvert lille bogstav, vi ønsker at matche:

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

Resultat:

+----------------+
| c1             |
+----------------+
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
+----------------+

Denne gang returneres færre rækker end i de foregående eksempler. Det er fordi jeg ikke har angivet tegn som é og ø , som blev returneret i disse eksempler. Vores resultat indeholder é men den række blev kun returneret, fordi den også indeholder andre små bogstaver, der gør match.

Derfor skal du sikre dig, at du har alle gyldige tegn dækket, hvis du bruger denne mulighed.

Mulighed 3:Sammenlign med en række tegn

En anden måde at gøre det på er at angive rækken af ​​tegn, vi vil matche:

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

Resultat:

+----------------+
| c1             |
+----------------+
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
+----------------+

  1. Sådan opretter du PL/SQL SYS_REFCURSOR i Oracle-databasen

  2. Sådan deaktiveres alle tjekbegrænsninger i SQL Server-databasen - SQL Server / TSQL vejledning del 87

  3. Android :Fejl ved kopiering af database (Sqliite) fra aktivmappe

  4. Bruger Oracle XMLType-kolonnen i dvale