SQLite
 sql >> Baza danych >  >> RDS >> SQLite

2 sposoby zwracania wartości nienumerycznych w SQLite

Poniższe przykłady SQLite zwracają tylko te wiersze, które w danej kolumnie mają wartości nieliczbowe.

Przykładowe dane

Stwórzmy tabelę z przykładowymi danymi:

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;

Tabela została utworzona i zawiera następujące dane:

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 używa dynamicznego systemu typów, w którym typ danych wartości jest powiązany z samą wartością, a nie z kolumną (jak w przypadku większości innych RDBMS). Tworząc tabelę, nie określiłem typu danych. Dlatego wartości mogą być dowolnego typu.

Typeof() Funkcja

Możemy użyć funkcji typeof() SQLite, aby wykluczyć typy numeryczne (real i integer ) przed zwróceniem w zapytaniu:

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

Wynik:

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

Oto kolejny przykład, który wyświetla typ danych dla każdego wiersza:

SELECT 
    c1,
    typeof(c1)
FROM t1;

Wynik:

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 pokazuje nam, że tylko ostatnie dwa wiersze zawierają dane nieliczbowe (zawierają text dane).

REGEXP Funkcja

Inną opcją jest użycie REGEXP przekazać wyrażenie regularne, aby zwrócić tylko te wartości, które pasują do podanego wzorca.

Przykład:

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

Wynik:

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

Zwróć liczby niebędące liczbami całkowitymi

Jeśli chcemy zwrócić tylko liczby niebędące liczbami całkowitymi, możemy wykonać następujące czynności:

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

Wynik:

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

Wyklucza to również liczby całkowite ze znakiem.

Lub możemy użyć wyrażenia regularnego, jeśli nasze wymagania są bardziej szczegółowe:

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

Wynik:

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

Nie zawiera danych liczbowych

Jeśli chcemy znaleźć wiersze, które nie zawierają żadnych danych liczbowych, możemy wykonać następujące czynności:

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

Wynik:

c1 
---
Ten

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak utworzyć tabelę tylko wtedy, gdy nie istnieje w SQLite

  2. sqlite uzyskaj pole z ponad 2 MB

  3. Zaktualizuj ListView w oparciu o ContentProvider wspierany przez SQLite

  4. Tabela opisów SQLite

  5. Indeks oparty na wyrażeniach SQLite