sql >> Database >  >> RDS >> SQLite

2 manieren om niet-numerieke waarden in SQLite te retourneren

De volgende SQLite-voorbeelden retourneren alleen die rijen met niet-numerieke waarden in een bepaalde kolom.

Voorbeeldgegevens

Laten we een tabel maken met voorbeeldgegevens:

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;

De tabel is nu aangemaakt en bevat de volgende gegevens:

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 gebruikt een dynamisch type systeem, waarbij het datatype van een waarde is gekoppeld aan de waarde zelf, niet aan de kolom (zoals bij de meeste andere RDBMS'en). Toen ik de tabel maakte, heb ik geen gegevenstype opgegeven. Daarom kunnen de waarden van elk type zijn.

Het Typeof() Functie

We kunnen de functie typeof() van SQLite gebruiken om numerieke typen uit te sluiten (real en integer ) niet worden geretourneerd in de zoekopdracht:

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

Resultaat:

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

Hier is nog een voorbeeld dat het gegevenstype voor elke rij uitvoert:

SELECT 
    c1,
    typeof(c1)
FROM t1;

Resultaat:

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      

Dit laat ons zien dat alleen de laatste twee rijen niet-numerieke gegevens bevatten (ze bevatten text gegevens).

De REGEXP Functie

Een andere optie is om REGEXP . te gebruiken om een ​​reguliere expressie door te geven om alleen die waarden te retourneren die overeenkomen met het gegeven patroon.

Voorbeeld:

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

Resultaat:

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

Niet-gehele getallen retourneren

Als we alleen niet-gehele getallen willen retourneren, kunnen we het volgende doen:

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

Resultaat:

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

Dit sluit ook ondertekende gehele getallen uit.

Of we kunnen een reguliere expressie gebruiken als onze vereisten specifieker zijn:

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

Resultaat:

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

Bevat geen numerieke gegevens

Als we rijen willen vinden die geen numerieke gegevens bevatten, kunnen we het volgende doen:

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

Resultaat:

c1 
---
Ten

  1. Oracle Analytic-functies - een windowing-clausule opnieuw instellen

  2. Oracle-vertraging tussen commit en select

  3. MySQL maakt syntaxis voor opgeslagen procedures met scheidingsteken

  4. Zoekcriteria verschil tussen Like vs Bevat() in oracle