sql >> Databasteknik >  >> RDS >> MariaDB

4 sätt att hitta rader som innehåller versaler i MariaDB

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

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 en POSIX-teckenklass

Vi kan använda REGEXP operatorn för att utföra en matchning av ett reguljärt uttrycksmönster.

Ett enkelt alternativ är att jämföra vår kolumn med [:upper:] POSIX teckenklass:

SELECT c1 FROM t1
WHERE c1 REGEXP '[[:upper:]]';

Resultat:

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

RLIKE är en synonym för REGEXP , så att vi kan ersätta REGEXP med RLIKE för att få samma resultat:

SELECT c1 FROM t1
WHERE c1 RLIKE '[[:upper:]]';

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

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

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

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 MariaDB en skiftlägesokänslig sökning, så jag använder BINARY operatör för att få en skiftlägeskänslig sökning.

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

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

Alternativ 3: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 versal som vi vill matcha:

SELECT c1 FROM t1
WHERE BINARY c1 REGEXP BINARY '[ABCDEFGHIJKLMNOPQRSTUVWXYZ]';

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 föregående 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 4:Jämför med en rad tecken

Ett annat sätt att göra det är att specificera intervallet av tecken vi vill matcha:

SELECT c1 FROM t1
WHERE BINARY c1 REGEXP BINARY '[A-Z]';

Resultat:

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

  1. Använd MySQL spatial extensions för att välja punkter inuti cirkeln

  2. Gruppering med ett ärendeutlåtande

  3. Sekvenser som inte påverkas av transaktioner?

  4. Hur man får åtkomst till PhpMyAdmin utan cPanel-inloggning