it-swarm-ko.tech

MySQL에서 값이 정수인지 확인하려면 어떻게합니까?

MySQL에는 값에서 정수를 만드는 Cast()Convert() 함수가 있지만 값이 정수인지 확인하는 방법이 있습니까? PHP에서 is_int()_와 같은 것이 내가 찾고있는 것입니다.

107
Craig Nakamoto

문자열 값을 확인한다고 가정합니다. 좋은 방법 중 하나는 문자열을 정규식과 일치시키는 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]+)$';


시작 부분에 선택적 더하기/빼기 기호, 하나의 선택적 소수점, 나머지 숫자를 사용할 수 있습니다.

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

True Waqas Malik은이 사건을 테스트하기 위해 완전히 안개를 tten습니다. 패치입니다.

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      |

demo 참조

2
Raymond Nijland

위에 나열된 정규식을 사용해 보았지만 다음과 같이 작동하지 않습니다.

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

위의 정규 표현식에 대한 문자열 '12 INCHES '의 테스트를 의미하는 1 (TRUE)를 반환하고 TRUE을 반환합니다. 위에서 사용한 정규식을 기반으로 한 숫자처럼 보입니다. 이 경우 12는 문자열의 시작 부분에 있으므로 정규식은 숫자로 해석합니다.

다음은 문자열이 숫자 대신 문자로 시작하기 때문에 올바른 값 (예 : 0)을 반환합니다.

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

문자열의 시작은 숫자가 아닌 텍스트이므로 위의 내용은 0 (FALSE)를 반환합니다.

그러나 숫자로 시작하는 숫자와 문자가 혼합 된 문자열을 다루는 경우 원하는 결과를 얻지 못할 수 있습니다. 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