sql >> Databáze >  >> RDS >> PostgreSQL

2 způsoby, jak vrátit řádky, které obsahují nealfanumerické znaky v PostgreSQL

Níže jsou dvě možnosti pro vrácení řádků, které v PostgreSQL obsahují pouze nealfanumerické znaky.

Nealfanumerické znaky zahrnují interpunkční znaménka jako [email protected]#&()–[{}]:;',?/* a symboly jako `~$^+=<>“ , stejně jako mezery, jako jsou mezery nebo tabulátory.

Ukázková data

Pro naše příklady použijeme následující data:

SELECT c1 FROM t1;

Výsledek:

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

Možnost 1:Porovnejte s [:alnum:]

Můžeme použít !~ PostgreSQL operátor k porovnání našeho sloupce s regulárním výrazem. Tento operátor používáme, když chceme určit, že hodnota neodpovídá regulárnímu výrazu.

Schopnost regulárních výrazů MySQL zahrnuje podporu pro znakové třídy POSIX. Proto můžeme použít [:alnum:] Třída znaků POSIX v našem regulárním výrazu.

SELECT c1 FROM t1 
WHERE c1 !~ '[[:alnum:]]';

Výsledek:

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

Prázdný řetězec je také číselně-numerický, takže tento příklad vrátil řádek, který obsahuje prázdný řetězec.

Prázdné řetězce můžeme vyloučit pomocí NULLIF() :

SELECT c1 FROM t1 
WHERE NULLIF(c1, '') !~ '[[:alnum:]]';

Výsledek:

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

Možnost 2:Určete rozsah znaků

Dalším způsobem, jak to udělat, je zadat rozsah znaků v regulárním výrazu.

Příklad:

SELECT c1 FROM t1
WHERE c1 !~ '[A-Za-z0-9]';

Výsledek:

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

A pro odstranění prázdného řetězce:

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

Výsledek:

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

V tomto případě můj rozsah vyloučení nezahrnoval alfanumerické znaky jako é , É a ø , takže výstup není skutečnou reprezentací nealfanumerických znaků. To znamená, že alespoň tato metoda vám dává možnost určit přesné znaky, které chcete zahrnout nebo vyloučit z výsledku.


  1. Psaní dotazu pro více tabulek v php

  2. Jaký je nejlepší způsob automatického generování příkazů INSERT pro tabulku serveru SQL?

  3. Jak mohu použít ROW_NUMBER()?

  4. Jak nastavit pondělí jako první den v týdnu na SQL Server