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