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


123

나는 MySQL의 안에 있다는 것을 볼 Cast()Convert()값의 정수를 생성하는 기능을하지만, 값이 정수가 있는지 확인하는 방법은 없나요? is_int()PHP에서 와 같은 것이 내가 찾고있는 것입니다.


2
그래서 슬프게도 우리는 MySQL의에서 is_int () 함수를 작성해야합니다
유다 Prawira

답변:


214

문자열 값을 확인하고 싶다고 가정하겠습니다. 한 가지 좋은 방법은 문자열을 정규식과 일치시키는 REGEXP 연산자입니다. 간단하게

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

이것은 상당히 빠릅니다. 필드가 숫자 인 경우

ceil(field) = field

대신.


4
'ceil (field) = field'테스트는 좋은 생각이지만 @Jumpy가 지적했듯이 숫자가 아닌 데이터에서는 실패합니다. SELECT ceil ( 'four') = 'four'; -> 1
Matthew Cornell

3
@MatthewCornell, 그는 당신의 분야가 숫자라면 말했다. 따라서 숫자가 정수인지 테스트 할 수 있습니다. 문자열에서는 작동하지 않으므로 첫 번째 옵션이 있습니다.
Malfist

데이터에 공백이 포함되어 있으면 실패합니다. 줄 바꿈을 제거하기 위해 추가 인수를 사용하여 trim (field) 테스트를 고려하십시오.
Michael Grazebrook

데이터가 숫자이므로이 작업도 수행 할 수 있습니다. select ((field % 1) = 0);
ThiamTeck

감사합니다,하지만 숫자 비교를 위해, 나는 당신이 (STRCMP (CEIL (필드), 필드)) 필요가 없다 생각
앨런 딕슨

14

정규식과 비교하십시오.

cf http://forums.mysql.com/read.php?60,1907,38488#msg-38488 아래 인용 :

Re : MySQL의 IsNumeric () 절 ??
게시자 : kevinclark ()
날짜 : 2005 년 8 월 8 일 오후 1시 01 분


나는 동의한다. 다음은 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]+)$';


이것은 시작 부분에 선택적 더하기 / 빼기 부호, 선택적 소수점 하나 및 나머지 숫자를 허용합니다.


감사합니다. 솔루션은 소수도 처리합니다.
Ananda Ananda

12

다음과 같은 항목이있는 영숫자 필드가있는 열이 있다고 가정합니다.

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

이 db 열 (이 경우 9582)에서 가장 높은 숫자 값을 원하면이 쿼리가 도움이 될 것입니다.

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

1
'10000' 은 더 높지만 쿼리는 여전히 '9582'를 반환 합니다.
Paul Spiegel

8

다음은 데이터 유형이 varchar라고 가정하는 간단한 솔루션입니다.

select * from calender where year > 0

연도가 숫자이면 true를 반환하고 그렇지 않으면 false를 반환합니다.


29
varchar에서 첫 번째 문자가 숫자 인 경우에도 true를 반환합니다.
TuK

그것을 알아 차리지 못했습니다. 최대 투표권 의견을 :)
Jayjitraj

8

이것은 또한 작동합니다 :

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

11
무엇에 대한 SELECT CAST('12a34' AS UNSIGNED), 어떤 반환 12?
Mike C

1
이것은 숫자가 아닌 항목을 테스트해야하는 경우 완벽하게 작동하며 더 많은 +1이 필요합니다. 다른 답변은 숫자가 아닌 항목을 찾기 위해 테스트를 역전하기가 더 어렵습니다.
DrCord

1
@DrCord이 때문에, 마이크 C가 설명하는 경우에없는 작업을 수행 매우 신뢰할
jontro

4

Mysql에서 값이 Int인지 확인하기 위해 다음 쿼리를 사용할 수 있습니다. 이 쿼리는 Int 값이있는 행을 제공합니다.

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

이것은 또한 정수가 아닌 숫자를 선택합니다 (예 : '3.5' ).
Paul Spiegel

4

내가 생각할 수있는 가장 좋은 변수는 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      |

참조 데모


열에 단일 문자 값이 있으면 실패합니다. 열에 'A'값이 있으면 Cast ( 'A'as UNSIGNED)는 0으로 평가되고 LENGTH (0)은 1이됩니다. 따라서 LENGTH (Cast ( 'A'as UNSIGNED)) = LENGTH (0)은 다음과 같이 평가됩니다. 1 = 1 => 1
Waqas Malik

주석에 대한 감사는 경우가 작동하고 지금 패치를 테스트 실제로 @WaqasMalik 검증되지 않은 것을 .. 뭔가 같은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;
레이몬드 Nijland

이것은 정말 멋진 솔루션입니다. 음의 정수에서는 실패한다고 생각하는데, 솔루션을 부호있는 정수로 전환하기 위해 실질적인 (가장자리의 경우) 어떤 것이 변경됩니까? 나는 당신의 바이올린을 기초로 사용하여 테스트했습니다. 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'을 처리하지 않습니다. 다시 말하지만, 매우 멋진 솔루션입니다.
spen.smith

3

이건 어떤가요:

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

숫자와 corrolary를 테스트하려면 :

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

1
CAST (table.field)! = 0 캐스트 할 유형이 필요하므로 작동하지 않습니다.
Riad

이것은 숫자가 아닌 항목을 테스트해야하는 경우 완벽하게 작동하며 더 많은 +1이 필요합니다. 다른 답변은 숫자가 아닌 항목을 찾기 위해 테스트를 역전하기가 더 어렵습니다.
DrCord

"0000", "0"(공백) 및 "7x"(숫자로 간주 됨)와 같은 숫자에는 작동하지 않습니다.
Michael Grazebrook

@MichaelGrazebrook 처음 두 경우에 정규식을 할 수 있다고 생각합니다. "7x"는 숫자로 간주됩니까? "0x7"은 숫자인데 7x?
Tom Auger 2015 년

1
@Tom Auger : 또 다른 대답은 정규식 유형 솔루션을 다루었습니다. 내가 "7 배는 숫자로 간주됩니다"을 의미하는 것은이 사항이 사실이다 : 7 = '7Q'를 선택
마이클 Grazebrook

1

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

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

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

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

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

문자열의 시작 부분이 숫자가 아니라 텍스트이기 때문에 위의 경우 0( FALSE) 를 반환 합니다.

그러나 숫자와 숫자로 시작하는 문자가 혼합 된 문자열을 처리하는 경우 원하는 결과를 얻을 수 없습니다. REGEXP는 실제로 그렇지 않은 경우 문자열을 유효한 숫자로 해석합니다.


2
이것은 올바르지 않습니다. 테스트 했습니까? 첫 번째 예제를 실행하면 FALSE예상대로을 반환 합니다. 정규식이 $문자열의 끝을 의미하는 것으로 끝나기 때문에 작성자가 의도 한대로 숫자 만 확인하기 때문입니다.
spikyjt

1

이것은 숫자로 시작하는 VARCHAR에서 잘 작동합니다.

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

더 큰 NNNNE +-번호에 도달하면 제한이있을 수 있습니다.


단일 문자 문자열에서는 작동하지 않는 것 같습니다set @val = '5'; SELECT @val, concat('', @val * 1) != @val is_int;
spen.smith

0

나를 위해 작동하는 유일한 것은 다음과 같습니다.

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

kevinclark에서 다른 모든 것은 나에게 쓸모없는 물건을 반환 234jk456하거나12 inches

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.