web-dev-qa-db-ja.com

MySQLで値が整数かどうかを確認するにはどうすればよいですか?

MySQLには、値から整数を作成するCast()およびConvert()関数がありますが、値が整数かどうかを確認する方法はありますか? PHPのis_int()のようなものが私が探しているものです。

107
Craig Nakamoto

文字列値を確認したいと仮定します。良い方法の1つは、文字列を正規表現に一致させるREGEXP演算子です。単純に

select field from table where field REGEXP '^-?[0-9]+$';

これはかなり高速です。フィールドが数値の場合、テストするだけです

ceil(field) = field

代わりに。

192
Jumpy

正規表現と照合します。

c.f. http://forums.mysql.com/read.php?60,1907,38488#msg-38488 以下に引用したとおり:

Re:MySQLのIsNumeric()句??
投稿者:kevinclark()
日付:2005年8月8日01:01 PM


同意する。以下は、MySQL 5用に作成した関数です。

CREATE FUNCTION IsNumeric (sIn varchar(1024)) RETURNS tinyint
RETURN sIn REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$';


これにより、先頭にオプションのプラス/マイナス記号、1つのオプションの小数点、および残りの数字を使用できます。

13
JBB

次のようなエントリを持つ英数字フィールドを持つ列があるとします

a41q
1458
xwe8
1475
asde
9582
.
.
.
.
.
qe84

このdb列から最高の数値(この場合は9582)が必要な場合は、このクエリが役立ちます

SELECT Max(column_name) from table_name where column_name REGEXP '^[0-9]+$'
10
Tarun Sood

これは、データ型がvarcharであると仮定した場合の簡単な解決策です

select * from calender where year > 0

年が数値の場合はtrueを返し、そうでない場合はfalseを返します

8
Jayjitraj

これも機能します:

CAST( coulmn_value AS UNSIGNED ) // will return 0 if not numeric string.

例えば

SELECT CAST('a123' AS UNSIGNED) // returns 0
SELECT CAST('123' AS UNSIGNED) // returns 123 i.e. > 0
6
Riad

Mysqlで値がIntかどうかを確認するには、次のクエリを使用できます。このクエリは、Int値を持つ行を提供します

SELECT col1 FROM table WHERE concat('',col * 1) = col;
4
minhas23

どうですか:

WHERE table.field = "0" or CAST(table.field as SIGNED) != 0

数値と冠詞をテストするには:

WHERE table.field != "0" and CAST(table.field as SIGNED) = 0
3
Tom Auger

変数について考えるのに最適なのはintです。MySQLの関数CAST()およびLENGTH()との組み合わせです。
このメソッドは、文字列、整数、double/floatsデータ型で機能します。

SELECT (LENGTH(CAST(<data> AS UNSIGNED))) = (LENGTH(<data>)) AS is_int

デモを見る http://sqlfiddle.com/#!9/ff40cd/44

列に単一の文字値がある場合は失敗します。列の値が「A」の場合、Cast( 'A' as UNSIGNED)は0に評価され、LENGTH(0)は1になります。したがって、LENGTH(Cast( 'A' as UNSIGNED))= LENGTH(0)は1 = 1 => 1

真のWaqas Malikは、このケースをテストするために完全に忘れていました。パッチは。

SELECT <data>, (LENGTH(CAST(<data> AS UNSIGNED))) = CASE WHEN CAST(<data> AS UNSIGNED) = 0 THEN CAST(<data> AS UNSIGNED) ELSE (LENGTH(<data>)) END AS is_int;

結果

**Query #1**

    SELECT 1, (LENGTH(CAST(1 AS UNSIGNED))) = CASE WHEN CAST(1 AS UNSIGNED) = 0 THEN CAST(1 AS UNSIGNED) ELSE (LENGTH(1)) END AS is_int;

| 1   | is_int |
| --- | ------ |
| 1   | 1      |

---
**Query #2**

    SELECT 1.1, (LENGTH(CAST(1 AS UNSIGNED))) = CASE WHEN CAST(1.1 AS UNSIGNED) = 0 THEN CAST(1.1 AS UNSIGNED) ELSE (LENGTH(1.1)) END AS is_int;

| 1.1 | is_int |
| --- | ------ |
| 1.1 | 0      |

---
**Query #3**

    SELECT "1", (LENGTH(CAST("1" AS UNSIGNED))) = CASE WHEN CAST("1" AS UNSIGNED) = 0 THEN CAST("1" AS UNSIGNED) ELSE (LENGTH("1")) END AS is_int;

| 1   | is_int |
| --- | ------ |
| 1   | 1      |

---
**Query #4**

    SELECT "1.1", (LENGTH(CAST("1.1" AS UNSIGNED))) = CASE WHEN CAST("1.1" AS UNSIGNED) = 0 THEN CAST("1.1" AS UNSIGNED) ELSE (LENGTH("1.1")) END AS is_int;

| 1.1 | is_int |
| --- | ------ |
| 1.1 | 0      |

---
**Query #5**

    SELECT "1a", (LENGTH(CAST("1.1" AS UNSIGNED))) = CASE WHEN CAST("1a" AS UNSIGNED) = 0 THEN CAST("1a" AS UNSIGNED) ELSE (LENGTH("1a")) END AS is_int;

| 1a  | is_int |
| --- | ------ |
| 1a  | 0      |

---
**Query #6**

    SELECT "1.1a", (LENGTH(CAST("1.1a" AS UNSIGNED))) = CASE WHEN CAST("1.1a" AS UNSIGNED) = 0 THEN CAST("1.1a" AS UNSIGNED) ELSE (LENGTH("1.1a")) END AS is_int;

| 1.1a | is_int |
| ---- | ------ |
| 1.1a | 0      |

---
**Query #7**

    SELECT "a1", (LENGTH(CAST("1.1a" AS UNSIGNED))) = CASE WHEN CAST("a1" AS UNSIGNED) = 0 THEN CAST("a1" AS UNSIGNED) ELSE (LENGTH("a1")) END AS is_int;

| a1  | is_int |
| --- | ------ |
| a1  | 0      |

---
**Query #8**

    SELECT "a1.1", (LENGTH(CAST("a1.1" AS UNSIGNED))) = CASE WHEN CAST("a1.1" AS UNSIGNED) = 0 THEN CAST("a1.1" AS UNSIGNED) ELSE (LENGTH("a1.1")) END AS is_int;

| a1.1 | is_int |
| ---- | ------ |
| a1.1 | 0      |

---
**Query #9**

    SELECT "a", (LENGTH(CAST("a" AS UNSIGNED))) = CASE WHEN CAST("a" AS UNSIGNED) = 0 THEN CAST("a" AS UNSIGNED) ELSE (LENGTH("a")) END AS is_int;

| a   | is_int |
| --- | ------ |
| a   | 0      |

デモ を参照

2
Raymond Nijland

上記の正規表現を使用してみましたが、次の場合は機能しません。

SELECT '12 INCHES' REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$' FROM ...

上記は1TRUE)を返します。つまり、上記の正規表現に対する文字列'12 INCHES 'のテストはTRUEを返します。上記で使用した正規表現に基づいた数字のように見えます。この場合、12は文字列の先頭にあるため、正規表現はそれを数字として解釈します。

次は、文字列が数字ではなく文字で始まるため、正しい値(つまり、0)を返します。

SELECT 'TOP 10' REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$' FROM ...

上記は0FALSE)を返します。これは、文字列の先頭がテキストであり、数値ではないためです。

ただし、数字と数字で始まる文字が混在する文字列を処理している場合、希望する結果が得られません。 REGEXPは、実際には文字列が有効ではないにもかかわらず、有効な番号として解釈します。

2
Bill Kelly

これは、数値で始まるかどうかにかかわらず、VARCHARでうまく機能します。

WHERE concat('',fieldname * 1) != fieldname 

より大きなNNNNE +-番号に到達すると制限が生じる場合があります

0
PodTech.io

私のために働く唯一のものは:

CREATE FUNCTION IsNumeric (SIN VARCHAR(1024)) RETURNS TINYINT
RETURN SIN REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$';

234jk456または12 inchesの場合、他のすべての無駄なものをkevinclarkから返す

0
Tim