Следните примери на SQLite връщат само онези редове, които имат числови стойности в дадена колона.
Примерни данни
Нека създадем таблица с примерни данни:
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;
Таблицата вече е създадена и съдържа следните данни:
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 използва система с динамични типове, при която типът данни на стойност е свързан със самата стойност, а не с колоната (както при повечето други RDBMS). Когато създадох таблицата, не посочих тип данни. Следователно стойностите могат да бъдат от всякакъв тип.
Typeof()
Функция
Можем да използваме функцията typeof() на SQLite, за да филтрираме резултатите само до числови типове (real
и integer
):
SELECT c1
FROM t1
WHERE typeof(c1) = 'real'
OR typeof(c1) = 'integer';
Резултат:
c1 ---------- 0 1 1 -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0
Само за да е ясно, ето пример, който извежда типа данни за всеки ред:
SELECT
c1,
typeof(c1)
FROM t1;
Резултат:
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
REGEXP
Функция
Ако имаме по-конкретни изисквания, можем алтернативно да използваме REGEXP
да предаде регулярен израз, за да върне само тези стойности, които съответстват на дадения модел.
Пример:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Резултат:
c1 ---------- 0 1 1 -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0
Връщане на цели числа
Ако искаме да върнем само цели числа, можем да опростим заявката, както следва:
SELECT c1
FROM t1
WHERE typeof(c1) = 'integer';
Резултат:
c1 -- 0 1 1 -1
Това също връща цели числа със знак.
Или можем да използваме регулярен израз, ако изискванията ни са по-конкретни:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[0-9]+$';
Резултат:
c1 -- 0 1 1
Съдържа числови данни
Ако искаме да намерим редове, които съдържат числови данни (дори и да съдържат нечислови данни), можем да направим следното:
SELECT c1
FROM t1
WHERE c1 REGEXP '[0-9]+';
Резултат:
c1 ---------- 0 1 1 -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0 5 Dollars