Kueri MySQL berikut hanya mengembalikan baris yang memiliki nilai numerik dalam kolom tertentu.
Contoh Data
Misalkan kita membuat tabel seperti ini:
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
c1 varchar(255)
);
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'),
('a'),
('9afc'),
('e7'),
('+e0'),
('Ten'),
('5 Dollars');
SELECT * FROM t1;
Tabel sekarang telah dibuat dan berisi data berikut:
+-----------+ | c1 | +-----------+ | 0 | | 1 | | +1 | | -1 | | 00.00 | | 73.45 | | +73.45 | | -73.45 | | .246 | | -.34e7 | | 12.e-3 | | 1.2e+4 | | a | | 9afc | | e7 | | +e0 | | Ten | | 5 Dollars | +-----------+
Kolomnya adalah varchar(255)
kolom, jadi bukan numerik. Itu dapat (dan memang) berisi angka tetapi ini disimpan sebagai data karakter. Itu juga dapat berisi teks arbitrer (yang memang benar).
Kembalikan Semua Nilai Numerik
Kita dapat menggunakan kueri berikut untuk mengembalikan semua nilai numerik dari tabel di atas:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Hasil:
+--------+ | c1 | +--------+ | 0 | | 1 | | +1 | | -1 | | 00.00 | | 73.45 | | +73.45 | | -73.45 | | .246 | | -.34e7 | | 1.2e+4 | | e7 | | +e0 | +--------+
Di sini, kami menggunakan REGEXP
berfungsi untuk mencocokkan hanya nilai yang cocok dengan pola yang kita tentukan.
Kembalikan Bilangan Bulat
Jika kita hanya ingin mengembalikan bilangan bulat, polanya bisa jauh lebih sederhana:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[0-9]+$';
Hasil:
+------+ | c1 | +------+ | 0 | | 1 | +------+
Berisi Data Numerik
Jika kita ingin mencari baris yang hanya berisi data numerik (meskipun juga berisi data non-numerik), kita dapat melakukan hal berikut:
SELECT c1
FROM t1
WHERE c1 REGEXP '[0-9]+';
Hasil:
+-----------+ | c1 | +-----------+ | 0 | | 1 | | +1 | | -1 | | 00.00 | | 73.45 | | +73.45 | | -73.45 | | .246 | | -.34e7 | | 12.e-3 | | 1.2e+4 | | 9afc | | e7 | | +e0 | | 5 Dollars | +-----------+
Kelas Karakter POSIX
MySQL mendukung kelas karakter POSIX, yang berarti kita dapat menggunakan [:digit:]
bukannya [0-9]
dalam ekspresi reguler kami.
Contoh:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[[:digit:]]?$';
Yang setara dengan berikut ini:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[0-9]?$';