sql >> Databáze >  >> RDS >> Mysql

3 způsoby, jak najít řádky, které obsahují velká písmena v MySQL

Zde jsou tři možnosti, jak v MySQL vrátit řádky, které obsahují velká písmena.

Ukázková data

Předpokládejme, že máme tabulku s následujícími údaji:

SELECT c1 FROM t1;

Výsledek:

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

K vrácení řádků, které obsahují velká písmena, můžeme použít následující metody.

Možnost 1:Porovnejte s LOWER() Řetězec

Můžeme použít LOWER() funkce pro porovnání původní hodnoty s jejím malým ekvivalentem:

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

Výsledek:

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

Pomocí nerovná se (<> ) operátor (můžete také použít != místo <> pokud chcete), vracíme pouze ty řádky, které se liší od jejich malých ekvivalentů. Důvodem, proč to děláme, je to, že pokud je hodnota stejná jako její ekvivalent malým písmenem, pak již byla na začátku malá (a my to nechceme vracet).

Ve výchozím nastavení MySQL provádí vyhledávání bez ohledu na velikost písmen, a proto používám CAST() funkce přetypovat hodnoty do binárního formátu, aby bylo možné vyhledávat s rozlišením velkých a malých písmen.

Je také možné použít BINARY operátor přetypovat hodnotu na binární, ale tento operátor je od MySQL 8.0.27 zastaralý a mohl by být v budoucí verzi odstraněn.

V každém případě takto vypadá kód při použití BINARY operátor:

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

Lze to udělat také takto:

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

Zde jsou výsledky, které získám z obou těchto při spuštění kódu v MySQL 8.0.27:

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

A když ukážu varování:

SHOW WARNINGS;

Výsledek:

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

Možnost 2:Porovnejte se skutečnými postavami

Další možností je použít REGEXP operátor se vzorem regulárního výrazu, který explicitně zahrnuje každý velký znak, který chceme porovnat:

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

Výsledek:

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

Tentokrát je vráceno méně řádků než v předchozích příkladech. Je to proto, že jsem nespecifikoval znaky jako É a Ø , které byly vráceny v těchto příkladech. Náš výsledek obsahuje É ale tento řádek byl vrácen pouze proto, že obsahuje také další velká písmena, která dělají zápas.

Pokud tedy použijete tuto možnost, musíte se ujistit, že máte pokryty všechny platné znaky.

Možnost 3:Porovnejte s řadou znaků

Dalším způsobem, jak to udělat, je zadat rozsah velkých písmen, které chceme porovnat:

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

Výsledek:

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

  1. Jak nainstalovat balíček ROracle na Windows 7?

  2. Oříznutí času od data a času – pokračování

  3. Oracle SQL plus jak ukončit příkaz v souboru SQL?

  4. Postgresql změňte typ sloupce z int na UUID