Có cách nào để phát hiện nếu một giá trị là một số trong truy vấn MySQL không? Nhu la
SELECT *
FROM myTable
WHERE isANumber(col1) = true
Có cách nào để phát hiện nếu một giá trị là một số trong truy vấn MySQL không? Nhu la
SELECT *
FROM myTable
WHERE isANumber(col1) = true
Câu trả lời:
Điều này sẽ làm việc trong hầu hết các trường hợp.
SELECT * FROM myTable WHERE concat('',col1 * 1) = col1
Nó không hoạt động đối với các số không chuẩn như
1e4
1.2e5
123.
(dấu thập phân)Bạn cũng có thể sử dụng Biểu thức chính quy ... nó sẽ giống như:
SELECT * FROM myTable WHERE col1 REGEXP '^[0-9]+$';
Tham khảo: http://dev.mysql.com/doc/refman/5.1/en/regapi.html
WHERE col1 NOT REGEXP...
và đối với trường hợp bạn có thể có dấu thập phân, hãy sử dụng regex:^[0-9\.]+$
Nếu dữ liệu của bạn là 'test', 'test0', 'test1111', '111test', '111'
Để chọn tất cả các bản ghi trong đó dữ liệu là một int đơn giản:
SELECT *
FROM myTable
WHERE col1 REGEXP '^[0-9]+$';
Kết quả: '111'
(Trong regex, ^ có nghĩa là bắt đầu và $ có nghĩa là kết thúc)
Để chọn tất cả các bản ghi có số nguyên hoặc số thập phân tồn tại:
SELECT *
FROM myTable
WHERE col1 REGEXP '^[0-9]+\\.?[0-9]*$'; - for 123.12
Kết quả: '111' (giống như ví dụ trước)
Cuối cùng, để chọn tất cả các bản ghi nơi số tồn tại, sử dụng:
SELECT *
FROM myTable
WHERE col1 REGEXP '[0-9]+';
Kết quả: 'test0' và 'test1111' và '111test' và '111'
REGEXP '^[+\-]?[0-9]+\\.?[0-9]*$'
SELECT * FROM myTable
WHERE col1 REGEXP '^[+-]?[0-9]*([0-9]\\.|[0-9]|\\.[0-9])[0-9]*(e[+-]?[0-9]+)?$'
Cũng sẽ khớp các số thập phân đã ký (như -1.2, +0.2, 6., 2e9, 1.2e-10 ).
Kiểm tra:
drop table if exists myTable;
create table myTable (col1 varchar(50));
insert into myTable (col1)
values ('00.00'),('+1'),('.123'),('-.23e4'),('12.e-5'),('3.5e+6'),('a'),('e6'),('+e0');
select
col1,
col1 + 0 as casted,
col1 REGEXP '^[+-]?[0-9]*([0-9]\\.|[0-9]|\\.[0-9])[0-9]*(e[+-]?[0-9]+)?$' as isNumeric
from myTable;
Kết quả:
col1 | casted | isNumeric
-------|---------|----------
00.00 | 0 | 1
+1 | 1 | 1
.123 | 0.123 | 1
-.23e4 | -2300 | 1
12.e-5 | 0.00012 | 1
3.5e+6 | 3500000 | 1
a | 0 | 0
e6 | 0 | 0
+e0 | 0 | 0
Trả về các hàng số
Tôi tìm thấy giải pháp với truy vấn sau và làm việc cho tôi:
SELECT * FROM myTable WHERE col1 > 0;
Truy vấn này trả về các hàng chỉ có cột số lớn hơn 0 col1
Trả về các hàng không số
nếu bạn muốn kiểm tra cột không phải là số, hãy thử cột này với mẹo ( !col1 > 0
):
SELECT * FROM myTable WHERE !col1 > 0;
SELECT * FROM myTable WHERE col1 = 123;
truy vấn sẽ trả về các hàng thậm chí giá trị col là123abc
sử dụng UDF (chức năng do người dùng xác định).
CREATE FUNCTION isnumber(inputValue VARCHAR(50))
RETURNS INT
BEGIN
IF (inputValue REGEXP ('^[0-9]+$'))
THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END;
Sau đó khi bạn truy vấn
select isnumber('383XXXX')
- trả lại 0
select isnumber('38333434')
- trả lại 1
chọn isnumber (mycol) mycol1, col2, colx từ bảngx; - sẽ trả về 1s và 0 cho cột mycol1
- bạn có thể tăng cường chức năng để lấy số thập phân, ký hiệu khoa học, v.v ...
Ưu điểm của việc sử dụng UDF là bạn có thể sử dụng nó ở bên trái hoặc bên phải của phép so sánh "mệnh đề where" của bạn. điều này giúp đơn giản hóa rất nhiều SQL của bạn trước khi được gửi đến cơ sở dữ liệu:
SELECT * from tablex where isnumber(columnX) = isnumber('UnkownUserInput');
hi vọng điêu nay co ich.
Một cách khác có vẻ nhanh hơn REGEXP trên máy tính của tôi là
SELECT * FROM myTable WHERE col1*0 != col1;
Điều này sẽ chọn tất cả các hàng trong đó col1 bắt đầu bằng một giá trị số.
AND col1<>0
để xử lý ngoại lệ đó.
'1a'
. BTW: nó tương đương với WHERE col1 <> 0
- rextester.com/DJIS1493
Vẫn còn thiếu phiên bản đơn giản này:
SELECT * FROM myTable WHERE `col1` + 0 = `col1`
(bổ sung nên nhanh hơn khi nhân)
Hoặc phiên bản chậm nhất để chơi tiếp:
SELECT *,
CASE WHEN `col1` + 0 = `col1` THEN 1 ELSE 0 END AS `IS_NUMERIC`
FROM `myTable`
HAVING `IS_NUMERIC` = 1
'a' + 0 = 'a'
là TRUE
Tôi khuyên bạn: nếu tìm kiếm của bạn đơn giản, bạn có thể sử dụng `
column*1 = column
`Toán tử thú vị :) là công việc và nhanh hơn trên các trường varchar / char
CHỌN * TỪ cột myTable WHERE * 1 = cột;
ABC*1 => 0 (NOT EQU **ABC**)
AB15*A => 15 (NOT EQU **AB15**)
15AB => 15 (NOT EQU **15AB**)
15 => 15 (EQUALS TRUE **15**)
select 'aaa123' >= 0
và select '123aaa' >= 0
trả về đúng không?
SELECT * FROM myTable WHERE sign (col1)!=0
dấu hiệu (0) bằng 0, nhưng sau đó bạn có thể hạn chế truy vấn của mình để ...
SELECT * FROM myTable WHERE sign (col1)!=0 or col1=0
CẬP NHẬT: Điều này không đáng tin cậy 100%, vì "1abc" sẽ trả về dấu 1, nhưng "ab1c" sẽ trả về 0 ... vì vậy điều này chỉ có thể hoạt động đối với văn bản không bắt đầu bằng số.
Hãy thử Chia / 1
select if(value/1>0 or value=0,'its a number', 'its not a number') from table