sql >> Databasteknik >  >> RDS >> Mysql

3 sätt att hitta rader som innehåller versaler i MySQL

Här är tre alternativ för att returnera rader som innehåller versaler i MySQL.

Exempeldata

Anta att vi har en tabell med följande data:

SELECT c1 FROM t1;

Resultat:

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

Vi kan använda följande metoder för att returnera de rader som innehåller versaler.

Alternativ 1:Jämför med LOWER() Sträng

Vi kan använda LOWER() funktion för att jämföra det ursprungliga värdet med dess gemener:

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

Resultat:

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

Genom att använda inte lika med (<> ) operator (du kan alternativt använda != istället för <> om du föredrar det), returnerar vi bara de rader som skiljer sig från deras gemener. Anledningen till att vi gör detta är att om ett värde är detsamma som dess gemener, så var det redan gemener till att börja med (och vi vill inte returnera det).

Som standard utför MySQL en skiftlägesokänslig sökning, så jag använder CAST() funktion för att casta värdena till binära för att få en skiftlägeskänslig sökning.

Det är också möjligt att använda BINARY operatorn för att casta värdet till binär, men denna operator är utfasad från och med MySQL 8.0.27 och den kan tas bort i en framtida version.

Hur som helst, så här ser koden ut när du använder BINARY operatör:

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

Det kan också göras så här:

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

Här är resultaten jag får från båda dessa när jag kör koden i MySQL 8.0.27:

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

Och när jag visar varningarna:

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

Alternativ 2:Jämför med de faktiska tecknen

Ett annat alternativ är att använda REGEXP operator med ett reguljärt uttrycksmönster som uttryckligen inkluderar varje versaltecken som vi vill matcha:

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

Resultat:

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

Denna gång returneras färre rader än i de tidigare exemplen. Det beror på att jag inte angav tecken som É och Ø , som returnerades i dessa exempel. Vårt resultat innehåller É men den raden returnerades bara eftersom den också innehåller andra versaler som gör match.

Därför måste du se till att du har alla giltiga tecken täckta om du använder det här alternativet.

Alternativ 3:Jämför med en rad tecken

Ett annat sätt att göra det är att ange intervallet för versaler som vi vill matcha:

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

Resultat:

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

  1. SQL Server Service Broker konversationsgrupper

  2. Förbättra MySQL-prestanda med avancerade InnoDB-inställningar

  3. Hur man listar tabeller i MySQL och MariaDB

  4. Oracle DateTime i Where-klausul?