回答:
これはほとんどの場合に機能します。
SELECT * FROM myTable WHERE concat('',col1 * 1) = col1
次のような非標準の番号では機能しません
1e4
1.2e5
123.
(末尾10進数)正規表現も使用できます...次のようになります。
SELECT * FROM myTable WHERE col1 REGEXP '^[0-9]+$';
リファレンス: http : //dev.mysql.com/doc/refman/5.1/en/regexp.html
WHERE col1 NOT REGEXP...
、あなたは小数点を持っているかもしれない場合のために、使用の正規表現:^[0-9\.]+$
データが「test」、「test0」、「test1111」、「111test」、「111」の場合
データが単純なintであるすべてのレコードを選択するには:
SELECT *
FROM myTable
WHERE col1 REGEXP '^[0-9]+$';
結果: '111'
(正規表現では、^は開始を意味し、$は終了を意味します)
整数または10進数が存在するすべてのレコードを選択するには:
SELECT *
FROM myTable
WHERE col1 REGEXP '^[0-9]+\\.?[0-9]*$'; - for 123.12
結果: '111'(最後の例と同じ)
最後に、 numberが存在するすべてのレコードを選択するには、これを使用します。
SELECT *
FROM myTable
WHERE col1 REGEXP '[0-9]+';
結果:「test0」と「test1111」と「111test」と「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]+)?$'
符号付き10進数にも一致します(-1.2、+ 0.2、6、2e9、1.2e-10など)。
テスト:
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;
結果:
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
数値行を返します
私は次のクエリで解決策を見つけ、私のために働きました:
SELECT * FROM myTable WHERE col1 > 0;
このクエリは、0より大きい列のみを持つ行を返します。 col1
非数値行を返します
数値ではない列をチェックしたい場合は、トリック(!col1 > 0
)でこれを試してください:
SELECT * FROM myTable WHERE !col1 > 0;
SELECT * FROM myTable WHERE col1 = 123;
クエリはcolの値が次の場合でも行を返すため123abc
UDF(ユーザー定義関数)を使用します。
CREATE FUNCTION isnumber(inputValue VARCHAR(50))
RETURNS INT
BEGIN
IF (inputValue REGEXP ('^[0-9]+$'))
THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END;
次に、クエリを実行すると
select isnumber('383XXXX')
-0を返します
select isnumber('38333434')
-戻り値1
tablexからisnumber(mycol)mycol1、col2、colxを選択します。-列mycol1に1と0を返します
-小数、科学表記などを使用するように関数を拡張できます。
UDFを使用する利点は、「where句」比較の左側または右側で使用できることです。これにより、SQLがデータベースに送信される前に大幅に簡素化されます。
SELECT * from tablex where isnumber(columnX) = isnumber('UnkownUserInput');
お役に立てれば。
私のコンピュータではREGEXPよりも高速に見える別の方法は
SELECT * FROM myTable WHERE col1*0 != col1;
これにより、col1が数値で始まるすべての行が選択されます。
AND col1<>0
その例外を処理するために単に追加できると思います。
この単純なバージョンがまだありません:
SELECT * FROM myTable WHERE `col1` + 0 = `col1`
(足し算は掛け算として速くなるはずです)
またはさらに再生するための最も遅いバージョン:
SELECT *,
CASE WHEN `col1` + 0 = `col1` THEN 1 ELSE 0 END AS `IS_NUMERIC`
FROM `myTable`
HAVING `IS_NUMERIC` = 1
'a' + 0 = 'a'
is TRUE
私はお勧めします:検索が単純な場合は、 `
column*1 = column
`興味深いオペレータ:)は機能し、フィールドvarchar / charよりも高速です。
SELECT * FROM myTable WHERE column * 1 = column;
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
との両方がselect '123aaa' >= 0
true を 返すことを知っていますか?