Bir değerin MySQL sorgusundaki bir sayı olup olmadığını tespit etmenin bir yolu var mı? Gibi
SELECT *
FROM myTable
WHERE isANumber(col1) = true
Bir değerin MySQL sorgusundaki bir sayı olup olmadığını tespit etmenin bir yolu var mı? Gibi
SELECT *
FROM myTable
WHERE isANumber(col1) = true
Yanıtlar:
Bu çoğu durumda işe yarar.
SELECT * FROM myTable WHERE concat('',col1 * 1) = col1
Standart olmayan sayılar için çalışmaz
1e4
1.2e5
123.
(sondaki ondalık)Normal İfadeyi de kullanabilirsiniz ...
SELECT * FROM myTable WHERE col1 REGEXP '^[0-9]+$';
Referans: http://dev.mysql.com/doc/refman/5.1/en/regexp.html
WHERE col1 NOT REGEXP...
ve ondalık basamağınız olabileceği durumda regex kullanın:^[0-9\.]+$
Verileriniz 'test', 'test0', 'test1111', '111test', '111'
Verilerin basit bir int olduğu tüm kayıtları seçmek için:
SELECT *
FROM myTable
WHERE col1 REGEXP '^[0-9]+$';
Sonuç: '111'
(Normal ifadede, ^ başlangıç ve $ bitiş anlamına gelir)
Bir tamsayı veya ondalık sayının bulunduğu tüm kayıtları seçmek için:
SELECT *
FROM myTable
WHERE col1 REGEXP '^[0-9]+\\.?[0-9]*$'; - for 123.12
Sonuç: '111' (son örnekle aynı)
Son olarak, numaranın bulunduğu tüm kayıtları seçmek için şunu kullanın:
SELECT *
FROM myTable
WHERE col1 REGEXP '[0-9]+';
Sonuç: 'test0' ve 'test1111' ve '111test' ve '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]+)?$'
İmzalı ondalıklarla da eşleşir ( -1.2, +0.2, 6., 2e9, 1.2e-10 gibi ).
Ölçek:
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;
Sonuç:
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
Sayısal satırları döndürür
Aşağıdaki sorgu ile çözüm buldum ve benim için çalışıyor:
SELECT * FROM myTable WHERE col1 > 0;
Bu sorgu yalnızca sıfırdan büyük sütun içeren satırları döndürür. col1
Sayısal olmayan satırları döndürür
sayısal olmayan sütunu kontrol etmek istiyorsanız bunu trick ( !col1 > 0
) ile deneyin :
SELECT * FROM myTable WHERE !col1 > 0;
SELECT * FROM myTable WHERE col1 = 123;
sorgu col değerini bile satır döndürecek123abc
bir UDF kullanın (kullanıcı tanımlı fonksiyon).
CREATE FUNCTION isnumber(inputValue VARCHAR(50))
RETURNS INT
BEGIN
IF (inputValue REGEXP ('^[0-9]+$'))
THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END;
Sonra sorgulamak
select isnumber('383XXXX')
--0 döndürür
select isnumber('38333434')
--1 döndürür
tablex'ten isnumber (mycol) mycol1, col2, colx'i seçin; - mycol1 sütunu için 1s ve 0s döndürür
- ondalık sayı, bilimsel gösterim vb.
Bir UDF kullanmanın avantajı, "nerede yan tümcesi" karşılaştırmanızın sol veya sağ tarafında kullanabilmenizdir. bu, veritabanına gönderilmeden önce SQL'inizi büyük ölçüde basitleştirir:
SELECT * from tablex where isnumber(columnX) = isnumber('UnkownUserInput');
Bu yardımcı olur umarım.
Bilgisayarımdaki REGEXP'den daha hızlı görünen başka bir alternatif
SELECT * FROM myTable WHERE col1*0 != col1;
Bu, col1 öğesinin sayısal bir değerle başladığı tüm satırları seçer.
AND col1<>0
bu istisnayı ele almak için ekleyebilirsiniz .
Bu basit sürümü hâlâ eksik:
SELECT * FROM myTable WHERE `col1` + 0 = `col1`
(toplama çarpma işlemi kadar hızlı olmalıdır)
Ya da daha fazla oynamak için en yavaş sürüm:
SELECT *,
CASE WHEN `col1` + 0 = `col1` THEN 1 ELSE 0 END AS `IS_NUMERIC`
FROM `myTable`
HAVING `IS_NUMERIC` = 1
'a' + 0 = 'a'
DOĞRU
Öneririm: aramanız basitse,
column*1 = column
`operatör ilginç :) çalışma ve alanlardan daha hızlı varchar / char
SEÇ * myTable NEREDEN sütun * 1 = sütun;
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
ve select '123aaa' >= 0
dönüşün doğru olduğunu biliyor musunuz ?
SELECT * FROM myTable WHERE sign (col1)!=0
ofcourse sign (0) sıfır, ancak daha sonra sorgunuzu kısıtlayabilirsiniz ...
SELECT * FROM myTable WHERE sign (col1)!=0 or col1=0
GÜNCELLEME: Bu% 100 güvenilir değildir, çünkü "1abc" 1 işareti döndürür, ancak "ab1c" sıfır döndürür ... bu nedenle bu yalnızca sayılarla başlamayan metinler için kullanılabilir.
Bölmeyi deneyin / 1
select if(value/1>0 or value=0,'its a number', 'its not a number') from table