回答:
文字列の値を確認したいとします。良い方法の1つはREGEXP演算子で、文字列を正規表現と照合します。単に行う
select field from table where field REGEXP '^-?[0-9]+$';
これはかなり高速です。フィールドが数値の場合は、テストしてください
ceil(field) = field
代わりに。
正規表現と照合します。
cf http://forums.mysql.com/read.php?60,1907,38488#msg-38488 as quoted under:
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つのオプションの小数点、および残りの数字を使用できます。
これは、データ型がvarcharであると仮定した場合の簡単な解決策です
select * from calender where year > 0
年が数値の場合はtrueを返し、それ以外の場合はfalseを返します
これも機能します:
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
SELECT CAST('12a34' AS UNSIGNED)、どのリターン12?
私が変数と考えることができる最高のものはintですMySQLの関数CAST()との組み合わせLENGTH()です。
このメソッドは、文字列、整数、倍精度浮動小数点データ型で機能します。
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
True Waqas Malikはそのケースをテストするために完全にfogoteしました。パッチです。
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 |
デモを見る
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;
set @val = '1.'; SELECT @val, LENGTH(CAST(@val AS SIGNED)) = IF(CAST(@val AS SIGNED) = 0, CAST(@val AS SIGNED), LENGTH(@val)) AS is_int;このリファクタリングは上記のすべてのケースを処理しますが、私の調整でさえ-1.0または '-1'を処理しません。再び、超クールなソリューション。
何について:
WHERE table.field = "0" or CAST(table.field as SIGNED) != 0
数値と冠詞をテストするには:
WHERE table.field != "0" and CAST(table.field as SIGNED) = 0
上記の正規表現を使用してみましたが、次の場合は機能しません。
SELECT '12 INCHES' REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$' FROM ...
上記は1(TRUE)を返しますTRUE。つまり、上記の正規表現に対する文字列'12 INCHES 'のテストはを返します。これは、上記で使用した正規表現に基づく数字のように見えます。この場合、12は文字列の先頭にあるため、正規表現は12を数値として解釈します。
以下は0、文字列が数字ではなく文字で始まるため、正しい値(つまり)を返します
SELECT 'TOP 10' REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$' FROM ...
文字列の先頭は数値ではなくテキストであるため、上記は0(FALSE)を返します。
ただし、数字と数字で始まる文字が混在する文字列を処理している場合は、期待どおりの結果が得られません。REGEXPは、実際にはそうではない場合でも、文字列を有効な数値として解釈します。
FALSEと、期待どおりが返されます。これは、正規表現$の末尾が文字列の終わりであるため、作成者が意図したとおりに数値のみをチェックしているためです。
これは、数値で始まるかどうかにかかわらず、VARCHARでうまく機能します。
WHERE concat('',fieldname * 1) != fieldname
NNNNE +-の数値が大きくなると制限がある場合があります
set @val = '5'; SELECT @val, concat('', @val * 1) != @val is_int;