나는 MySQL의 안에 있다는 것을 볼 Cast()
과 Convert()
값의 정수를 생성하는 기능을하지만, 값이 정수가 있는지 확인하는 방법은 없나요? is_int()
PHP에서 와 같은 것이 내가 찾고있는 것입니다.
나는 MySQL의 안에 있다는 것을 볼 Cast()
과 Convert()
값의 정수를 생성하는 기능을하지만, 값이 정수가 있는지 확인하는 방법은 없나요? is_int()
PHP에서 와 같은 것이 내가 찾고있는 것입니다.
답변:
문자열 값을 확인하고 싶다고 가정하겠습니다. 한 가지 좋은 방법은 문자열을 정규식과 일치시키는 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 아래 인용 :
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]+)$';
이것은 시작 부분에 선택적 더하기 / 빼기 부호, 선택적 소수점 하나 및 나머지 숫자를 허용합니다.
다음과 같은 항목이있는 영숫자 필드가있는 열이 있다고 가정합니다.
a41q
1458
xwe8
1475
asde
9582
.
.
.
.
.
qe84
이 db 열 (이 경우 9582)에서 가장 높은 숫자 값을 원하면이 쿼리가 도움이 될 것입니다.
SELECT Max(column_name) from table_name where column_name REGEXP '^[0-9]+$'
이것은 또한 작동합니다 :
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
?
Mysql에서 값이 Int인지 확인하기 위해 다음 쿼리를 사용할 수 있습니다. 이 쿼리는 Int 값이있는 행을 제공합니다.
SELECT col1 FROM table WHERE concat('',col * 1) = col;
내가 생각할 수있는 가장 좋은 변수는 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 |
참조 데모
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
숫자와 corrolary를 테스트하려면 :
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가 문자열의 시작 부분에 있으므로 정규식은이를 숫자로 해석합니다.
다음은 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;