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