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

3 modi per trovare righe che contengono lettere maiuscole in MySQL

Ecco tre opzioni per restituire le righe che contengono caratteri maiuscoli in MySQL.

Dati di esempio

Supponiamo di avere una tabella con i seguenti dati:

SELECT c1 FROM t1;

Risultato:

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

Possiamo usare i seguenti metodi per restituire le righe che contengono lettere maiuscole.

Opzione 1:confronta con LOWER() Stringa

Possiamo usare il LOWER() funzione per confrontare il valore originale con il suo equivalente minuscolo:

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

Risultato:

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

Utilizzando il diverso a (<> ) operatore (puoi in alternativa usare != invece di <> se preferisci), restituiamo solo quelle righe che sono diverse dai loro equivalenti minuscoli. Il motivo per cui lo facciamo è perché, se un valore è uguale al suo equivalente minuscolo, all'inizio era già minuscolo (e non vogliamo restituirlo).

Per impostazione predefinita, MySQL esegue una ricerca senza distinzione tra maiuscole e minuscole, quindi utilizzo CAST() funzione per eseguire il cast dei valori in binario in modo da ottenere una ricerca con distinzione tra maiuscole e minuscole.

È anche possibile utilizzare il BINARY per eseguire il cast del valore in binary, ma questo operatore è deprecato a partire da MySQL 8.0.27 e potrebbe essere rimosso in una versione futura.

In ogni caso, questo è l'aspetto del codice quando si utilizza il BINARY operatore:

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

Può anche essere fatto in questo modo:

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

Ecco i risultati che ottengo da entrambi durante l'esecuzione del codice in MySQL 8.0.27:

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

E quando mostro gli avvisi:

SHOW WARNINGS;

Risultato:

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

Opzione 2:confronta con i caratteri reali

Un'altra opzione è usare il REGEXP operatore con un modello di espressione regolare che include esplicitamente ogni carattere maiuscolo che vogliamo abbinare:

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

Risultato:

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

Questa volta vengono restituite meno righe rispetto agli esempi precedenti. Questo perché non ho specificato caratteri come É e Ø , che sono stati restituiti in quegli esempi. Il nostro risultato contiene É ma quella riga è stata restituita solo perché contiene anche altri caratteri maiuscoli che fa corrispondenza.

Pertanto, se utilizzi questa opzione, dovrai assicurarti di aver coperto tutti i caratteri validi.

Opzione 3:confronta con un intervallo di caratteri

Un altro modo per farlo è specificare l'intervallo di caratteri maiuscoli che vogliamo abbinare:

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

Risultato:

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