sql >> Databáze >  >> RDS >> SQLite

2 způsoby, jak vrátit nečíselné hodnoty v SQLite

Následující příklady SQLite vrátí pouze ty řádky, které mají v daném sloupci nečíselné hodnoty.

Ukázková data

Vytvořme tabulku s ukázkovými daty:

DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
    c1
);

INSERT INTO t1 (c1) VALUES 
    (0),
    (1),
    (+1),
    (-1),
    (00.00),
    (73.45),
    (+73.45),
    (-73.45),
    (.246),
    (-.34e7),
    (12.e-3),
    (1.2e+4),
    ('Ten'),
    ('5 Dollars');

SELECT * FROM t1;

Tabulka byla nyní vytvořena a obsahuje následující údaje:

c1        
----------
0         
1         
1         
-1        
0.0       
73.45     
73.45     
-73.45    
0.246     
-3400000.0
0.012     
12000.0   
Ten       
5 Dollars 

SQLite používá dynamický typový systém, kde datový typ hodnoty je spojen s hodnotou samotnou, nikoli se sloupcem (jako u většiny ostatních RDBMS). Když jsem vytvořil tabulku, nespecifikoval jsem datový typ. Hodnoty tedy mohou být libovolného typu.

Typeof() Funkce

Můžeme použít funkci typeof() SQLite k vyloučení číselných typů (real a integer ) z vracení v dotazu:

SELECT c1
FROM t1
WHERE typeof(c1) <> 'real'
AND typeof(c1) <> 'integer';

Výsledek:

c1       
---------
Ten      
5 Dollars

Zde je další příklad, který zobrazuje typ dat pro každý řádek:

SELECT 
    c1,
    typeof(c1)
FROM t1;

Výsledek:

c1          typeof(c1)
----------  ----------
0           integer   
1           integer   
1           integer   
-1          integer   
0.0         real      
73.45       real      
73.45       real      
-73.45      real      
0.246       real      
-3400000.0  real      
0.012       real      
12000.0     real      
Ten         text      
5 Dollars   text      

To nám ukazuje, že pouze poslední dva řádky obsahují nenumerická data (obsahují text data).

REGEXP Funkce

Další možností je použít REGEXP předat regulární výraz, který vrátí pouze ty hodnoty, které odpovídají danému vzoru.

Příklad:

SELECT c1
FROM t1 
WHERE c1 NOT REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';

Výsledek:

c1       
---------
Ten      
5 Dollars

Vrátí jiná než celá čísla

Pokud chceme vrátit pouze necelá čísla, můžeme udělat následující:

SELECT c1
FROM t1
WHERE typeof(c1) <> 'integer';

Výsledek:

c1        
----------
0.0       
73.45     
73.45     
-73.45    
0.246     
-3400000.0
0.012     
12000.0   
Ten       
5 Dollars 

To také nezahrnuje celá čísla se znaménkem.

Nebo bychom mohli použít regulární výraz, pokud jsou naše požadavky konkrétnější:

SELECT c1
FROM t1 
WHERE c1 NOT REGEXP '^[0-9]+$';

Výsledek:

c1        
----------
-1        
0.0       
73.45     
73.45     
-73.45    
0.246     
-3400000.0
0.012     
12000.0   
Ten       
5 Dollars 

Neobsahuje číselná data

Pokud chceme najít řádky, které neobsahují žádná číselná data, můžeme udělat následující:

SELECT c1 
FROM t1 
WHERE c1 NOT REGEXP '[0-9]+';

Výsledek:

c1 
---
Ten

  1. SQL DROP TABLE pro začátečníky

  2. Vyhledání sloupce rozdělení pro tabulku oddílů na serveru SQL Server (T-SQL)

  3. MySQL:Přidejte sloupec sekvence na základě jiného pole

  4. podivné kódování znaků uložených dat, starý skript je ukazuje dobře, nový ne