やり方(0以上の整数かどうか判定)
正規表現を使った判定
SELECT '判定対象文字列' REGEXP '^(0|[1-9][0-9]*)$';
判定対象文字列 | 判定結果 | 備考 |
---|---|---|
あいうえお | FALSE | |
12あいうえお | FALSE | |
e12 | FALSE | |
12.1 | FALSE | |
12.0 | FALSE | 見た目上は整数として扱えても、末尾に『.0』があるのでFALSE。 |
01 | FALSE | 見た目上は整数として扱えても、先頭に『0』があればFALSE。 |
012 | FALSE | 見た目上は整数として扱えても、先頭に『0』があればFALSE。 |
-12 | FALSE | |
00 | FALSE | 見た目上は整数として扱えても、『0』が複数繰り返されるだけの構成はFALSE。 |
0 | TRUE | 『0』が1文字だけならTRUE |
1 | TRUE | |
9 | TRUE | |
10 | TRUE | |
10000000 | TRUE |
なぜCAST()ではなく正規表現を使うのか
CAST()
を使うと想定通りの判定にならない為。
CAST('判定対象文字列' AS SIGNED) = 0
なら 整数ではない
というやり方だと想定通りの判定にならない場合がある。
例えば下記の結果は『0』ではなく『12』となってしまう。
先頭の『12』という文字列でキャストが成功してしまう。
SELECT CAST('12です' AS SIGNED);
演算コストはかかってしまうが、厳密に判定したいなら正規表現。
やり方(1以上の整数かどうか判定)
0をFALSEとしてよいなら正規表現パターンを少しシンプルにできる。
SELECT '判定対象文字列' REGEXP '^[1-9][0-9]*$';
やり方(-1や-10などの負もTRUEにしたい場合)
『-0』をFALSEにする為、マイナス記号を [1-9][0-9]
側に置くのがポイント。
SELECT '判定対象文字列' REGEXP '^(0|\-*[1-9][0-9]*)$';
参考サイトさん
バージョン
Windows 10 Pro 21H2 OSビルド 19044.1889
10.5.4-MariaDB
TODO:この記事の正規表現のロジックについて解説を載せておく