Mysql
 sql >> база данни >  >> RDS >> Mysql

2 начина за връщане на редове, които съдържат само не-буквени знаци в MySQL

По-долу са две опции за намиране на онези редове, които съдържат само небуквени и цифрови знаци в MySQL.

Небуквени и цифрови знаци включват препинателни знаци като [email protected]#&()–[{}]:;',?/* и символи като `~$^+=<>“ , както и празни знаци като интервалите или табулацията.

Примерни данни

Ще използваме следните данни за нашите примери:

CREATE TABLE t1 (
    c1 varchar(255) NULL
    );

INSERT INTO t1 VALUES
    ('Music'),
    ('Live Music'),
    ('Café'),
    ('Café Del Mar'),
    ('100 Cafés'),
    ('[email protected]'),
    ('1 + 1'),
    ('()'),
    ('[email protected]#&()–[{}]:;'',?/*'),
    ('`~$^+=<>“'),
    ('$1.50'),
    ('Player 456'),
    ('007'),
    (null),
    (''),
    ('é'),
    ('É'),
    ('é 123'),
    ('ø'),
    ('ø 123');
SELECT c1 FROM t1;

Резултат:

+----------------------+
| c1                   |
+----------------------+
| Music                |
| Live Music           |
| Café                 |
| Café Del Mar         |
| 100 Cafés            |
| [email protected]    |
| 1 + 1                |
| ()                   |
| [email protected]#&()–[{}]:;',?/*   |
| `~$^+=<>“            |
| $1.50                |
| Player 456           |
| 007                  |
| NULL                 |
|                      |
| é                    |
| É                    |
| é 123                |
| ø                    |
| ø 123                |
+----------------------+

Опция 1:Сравнете с [:alnum:]

Можем да използваме REGEXP на MySQL оператор, за да сравните нашата колона с регулярен израз.

Възможността за регулярни изрази на MySQL включва поддръжка за POSIX символните класове. Следователно можем да използваме [:alnum:] POSIX символен клас в нашите регулярни изрази, за да намерите редовете, които съдържат само буквено-цифрови знаци, след което отричайте това с NOT оператор.

SELECT c1 FROM t1 
WHERE c1 NOT REGEXP '[[:alnum:]]';

Резултат:

+----------------------+
| c1                   |
+----------------------+
| ()                   |
| [email protected]#&()–[{}]:;',?/*   |
| `~$^+=<>“            |
|                      |
+----------------------+

Ако трябва да изключите конкретен знак, винаги можете да използвате NULLIF() функция.

Например, нека изключим празния низ от последния ред:

SELECT c1 FROM t1
WHERE NULLIF(c1, '') NOT REGEXP '[[:alnum:]]';

Резултат:

+----------------------+
| c1                   |
+----------------------+
| ()                   |
| [email protected]#&()–[{}]:;',?/*   |
| `~$^+=<>“            |
+----------------------+

Опция 2:Посочете диапазон от знаци

Друг начин да го направите е да посочите диапазон от знаци във вашия регулярен израз.

Пример:

SELECT c1 FROM t1
WHERE c1 NOT REGEXP '[A-Za-z0-9]';

Резултат:

+----------------------+
| c1                   |
+----------------------+
| ()                   |
| [email protected]#&()–[{}]:;',?/*   |
| `~$^+=<>“            |
|                      |
| é                    |
| É                    |
| ø                    |
+----------------------+

И за да премахнете празния низ:

SELECT c1 FROM t1
WHERE NULLIF(c1, '') NOT REGEXP '[A-Za-z0-9]';

Резултат:

+----------------------+
| c1                   |
+----------------------+
| ()                   |
| [email protected]#&()–[{}]:;',?/*   |
| `~$^+=<>“            |
| é                    |
| É                    |
| ø                    |
+----------------------+

В този случай моят диапазон на изключване не обхваща буквено-цифрови знаци като é , É и ø , и така изходът не е истинско представяне на небуквени и цифрови знаци. Въпреки това, поне този метод ви дава възможност да посочите точните знаци, които искате да включите или изключите от резултата.

Алтернативи на REGEXP

В MySQL, RLIKE и REGXP операторите са синоними за REGEXP_LIKE() . Следователно можем да заменим всеки от предишните примери с NOT RLIKE или NOT REGEXP_LIKE() .

Пример за RLIKE :

SELECT c1 FROM t1 
WHERE c1 NOT RLIKE '[[:alnum:]]';

Пример за REGEXP_LIKE() :

SELECT c1 FROM t1 
WHERE NOT REGEXP_LIKE(c1, '[[:alnum:]]');

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да използвам подготвени изявления на mysqli?

  2. MySql разлика между две времеви марки в дни?

  3. Как да генерирам уникален идентификатор в MySQL?

  4. Как да изберете всичко преди/след определен символ в MySQL – SUBSTRING_INDEX()

  5. Получавате имена на колони на таблицата в MySQL?