Các ví dụ SQLite sau đây chỉ trả về những hàng có giá trị không phải số trong một cột nhất định.
Dữ liệu mẫu
Hãy tạo một bảng với dữ liệu mẫu:
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;
Bảng hiện đã được tạo và chứa dữ liệu sau:
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 sử dụng hệ thống kiểu động, trong đó kiểu dữ liệu của một giá trị được liên kết với chính giá trị đó, không phải cột (như với hầu hết các RDBMS khác). Khi tạo bảng, tôi không chỉ định loại dữ liệu. Do đó, các giá trị có thể là bất kỳ kiểu nào.
Typeof()
Chức năng
Chúng ta có thể sử dụng hàm typeof () của SQLite để loại trừ các kiểu số (real
và integer
) khỏi được trả về trong truy vấn:
SELECT c1
FROM t1
WHERE typeof(c1) <> 'real'
AND typeof(c1) <> 'integer';
Kết quả:
c1 --------- Ten 5 Dollars
Dưới đây là một ví dụ khác xuất ra loại dữ liệu cho mỗi hàng:
SELECT
c1,
typeof(c1)
FROM t1;
Kết quả:
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
Điều này cho chúng ta thấy rằng chỉ hai hàng cuối cùng chứa dữ liệu không phải số (chúng chứa text
dữ liệu).
REGEXP
Chức năng
Một tùy chọn khác là sử dụng REGEXP
để chuyển một biểu thức chính quy để chỉ trả về những giá trị khớp với mẫu đã cho.
Ví dụ:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Kết quả:
c1 --------- Ten 5 Dollars
Trả về số không phải là số nguyên
Nếu chúng ta chỉ muốn trả về các số không phải là số nguyên, chúng ta có thể làm như sau:
SELECT c1
FROM t1
WHERE typeof(c1) <> 'integer';
Kết quả:
c1 ---------- 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0 Ten 5 Dollars
Điều này cũng loại trừ các số nguyên có dấu.
Hoặc chúng tôi có thể sử dụng biểu thức chính quy nếu yêu cầu của chúng tôi cụ thể hơn:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '^[0-9]+$';
Kết quả:
c1 ---------- -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0 Ten 5 Dollars
Không chứa dữ liệu số
Nếu chúng ta muốn tìm các hàng không chứa bất kỳ dữ liệu số nào, chúng ta có thể làm như sau:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '[0-9]+';
Kết quả:
c1 --- Ten