MySQL에서 값이 숫자인지 감지


159

MySQL 쿼리에서 값이 숫자인지 감지하는 방법이 있습니까? 와 같은

SELECT * 
FROM myTable 
WHERE isANumber(col1) = true

1 * col = col 전략을 테스트했지만 PHP를 통해 쿼리를 호출하면 실패합니다 (그렇지 않으면 true를 반환합니다). 그러나 phpMyAdmin에서는 해킹이 작동합니다. 이것은 내 테스트가 예상대로 작동한다는 것을 의미합니다.
Jahaziel

답변:


251

대부분의 경우 작동합니다.

SELECT * FROM myTable WHERE concat('',col1 * 1) = col1

다음과 같은 비표준 숫자에는 작동하지 않습니다.

  • 1e4
  • 1.2e5
  • 123. (소수점)

감사합니다. 불행히도 123은 숫자이지만 123X는 그렇지 않다는 것을 인식해야합니다.
Urbycoz

1
@ Richard- 나는 당신이 준 예외를 읽었습니다. 캐릭터 "e"를 의미한다고 생각했습니다. 무슨 말인지 알 겠어
Urbycoz

선행 제로는 --- 트림 (COL1에서 선행 0) 솜씨의 SQL 개발자에 대한 문제가되지 않습니다
pimbrouwers

나는 그것이 오래된 게시물이라는 것을 알고 있지만 쿼리 에서이 방법을 사용합니다. 그러나 문제가 있습니다. "2-Power"를 "2"로 감지하면 문제가 발생하지 않으므로 문제가 발생합니다. 어떤 아이디어?
GRosay

1
후행 및 선행 0 (예 : 023.12000)의 경우 : concat ( '', col1 * 1) = '0'OR concat ( '', col1 * 1) = IF (LOCATE ( '.', col1), TRIM (BOTH ' col1에서 0 '), TRIM (col1에서'0 ')
François Breton

299

정규 표현식도 사용할 수 있습니다 ...

SELECT * FROM myTable WHERE col1 REGEXP '^[0-9]+$';

참조 : http://dev.mysql.com/doc/refman/5.1/en/regexp.html


70
SELECT * FROM myTable WHERE col1 REGEXP '^ [0-9] + $';
Dmitriy Kozmenko

7
받아 들여진 대답은 정말 영리하지만이 대답은 더 직접적이며 받아 들일만한 해결책이어야한다고 생각합니다.
pedromanoel

21
"does n't match": WHERE col1 NOT REGEXP...의 경우 소수점이있을 수있는 정규식을 사용하십시오 :^[0-9\.]+$
Robbie Averill

2
또한 과학적 표기법으로는 효과가없고, 정수로만 작동합니다
David Wilkins

1
정규 표현식 이주는 그것을 사용하지 않은 사람들을 위해 읽기가 어렵지만, 당신은 그것으로 정말 위대하고 짧은 일을 할 수 있습니다
Olli

56

데이터가 'test', 'test0', 'test1111', '111test', '111'인 경우

데이터가 간단한 int 인 모든 레코드를 선택하려면 다음을 수행하십시오.

SELECT * 
FROM myTable 
WHERE col1 REGEXP '^[0-9]+$';

결과 : '111'

(정규식에서 ^는 시작을 의미하고 $는 끝을 의미합니다)

정수 또는 10 진수가있는 모든 레코드를 선택하려면 다음을 수행하십시오.

SELECT * 
FROM myTable 
WHERE col1 REGEXP '^[0-9]+\\.?[0-9]*$'; - for 123.12

결과 : '111'(마지막 예제와 동일)

마지막으로 숫자가 존재하는 모든 레코드를 선택하려면 다음을 사용하십시오.

SELECT * 
FROM myTable 
WHERE col1 REGEXP '[0-9]+';

결과 : 'test0'및 'test1111'및 '111test'및 '111'


이 방법은 연결 트릭보다 명확하고 덜 해킹 적이기 때문에 더 좋습니다. 감사!
21시 57 분

8
음수 값에는 작동하지 않습니다. 제안 된 정규 표현식을 다음과 같이 수정합니다.REGEXP '^[+\-]?[0-9]+\\.?[0-9]*$'
Nicolas

"+"기호가 필요하지 않다고 말하면 "-?"만 사용할 수 있지만 사용하려는 경우이 기호를 이스케이프 처리해야합니다 ( "-"기호를 이스케이프 처리하지 않아도 됨) .
T. Corner

13
SELECT * FROM myTable
WHERE col1 REGEXP '^[+-]?[0-9]*([0-9]\\.|[0-9]|\\.[0-9])[0-9]*(e[+-]?[0-9]+)?$'

-1.2, +0.2, 6., 2e9, 1.2e-10 과 같이 부호가있는 소수와도 일치 합니다.

테스트:

drop table if exists myTable;
create table myTable (col1 varchar(50));
insert into myTable (col1) 
  values ('00.00'),('+1'),('.123'),('-.23e4'),('12.e-5'),('3.5e+6'),('a'),('e6'),('+e0');

select 
  col1,
  col1 + 0 as casted,
  col1 REGEXP '^[+-]?[0-9]*([0-9]\\.|[0-9]|\\.[0-9])[0-9]*(e[+-]?[0-9]+)?$' as isNumeric
from myTable;

결과:

col1   |  casted | isNumeric
-------|---------|----------
00.00  |       0 |         1
+1     |       1 |         1
.123   |   0.123 |         1
-.23e4 |   -2300 |         1
12.e-5 | 0.00012 |         1
3.5e+6 | 3500000 |         1
a      |       0 |         0
e6     |       0 |         0
+e0    |       0 |         0

데모


3
완전한! 실제로 모든 기초를 다루는 답만. 허용되는 답변이어야합니다.
Dom

10

숫자 행을 반환

나는 다음과 같은 쿼리로 해결책을 찾았고 나를 위해 일했다.

SELECT * FROM myTable WHERE col1 > 0;

이 쿼리는 숫자가 0보다 큰 행만 반환합니다. col1

숫자가 아닌 행을 반환

숫자가 아닌 열을 확인하려면 트릭 ( !col1 > 0)으로 시도하십시오 .

SELECT * FROM myTable WHERE !col1 > 0;

숫자 "123abc"로 시작하는 문자열이 있으면 숫자가 아닌 문이 아닌 숫자 행 문에 반환됩니다.
JStephen

@JStephen 당신이 맞아요! SELECT * FROM myTable WHERE col1 = 123;col value is123abc
Bora

9

이 답변은 Dmitry와 비슷하지만 소수점과 양수 및 음수를 허용합니다.

select * from table where col1 REGEXP '^[[:digit:]]+$'

8

UDF (사용자 정의 함수)를 사용하십시오.

CREATE FUNCTION isnumber(inputValue VARCHAR(50))
  RETURNS INT
  BEGIN
    IF (inputValue REGEXP ('^[0-9]+$'))
    THEN
      RETURN 1;
    ELSE
      RETURN 0;
    END IF;
  END;

그런 다음 쿼리하면

select isnumber('383XXXX') 

--0을 반환

select isnumber('38333434') 

--1을 반환

tablex에서 isnumber (mycol) mycol1, col2, colx를 선택하십시오. -mycol1 열에 대해 1과 0을 반환합니다.

-소수점, 과학적 표기법 등을 사용하도록 기능을 향상시킬 수 있습니다.

UDF를 사용하면 "where 절"비교의 왼쪽 또는 오른쪽에서 UDF를 사용할 수 있다는 장점이 있습니다. 이는 데이터베이스로 전송되기 전에 SQL을 크게 단순화합니다.

 SELECT * from tablex where isnumber(columnX) = isnumber('UnkownUserInput');

도움이 되었기를 바랍니다.


5

내 컴퓨터에서 REGEXP보다 빠른 다른 대안은

SELECT * FROM myTable WHERE col1*0 != col1;

이것은 col1이 숫자 값으로 시작하는 모든 행을 선택합니다.


2
값이 0이면 어떻습니까?
Urbycoz

1
AND col1<>0그 예외를 처리하기 위해 추가 할 수 있다고 생각합니다 .
Urbycoz

0 값에는 작동하지 않지만 004와 같이 채워진 숫자에는 완벽하게 작동하는 것이 사실입니다. 허용 된 답변은 채워진 숫자에 대해서는 작동하지 않습니다
Abbas

이것이 숫자를 확인하는 가장 좋은 방법이라고 생각합니다. SELECT * FROM myTable WHERE col1 * 0! = col1 OR col1 = '0'; 0으로 검사하기 위해 OR 문을 추가해야합니다.
Binu Raman

에 대한 오 탐지를 얻습니다 '1a'. BTW : 그것은 동등의 WHERE col1 <> 0- rextester.com/DJIS1493
폴 스피겔

4

이 간단한 버전이 여전히 누락되었습니다.

SELECT * FROM myTable WHERE `col1` + 0 = `col1`

(더하기는 곱셈보다 빠릅니다)

또는 추가 재생을위한 가장 느린 버전 :

SELECT *, 
CASE WHEN `col1` + 0 = `col1` THEN 1 ELSE 0 END AS `IS_NUMERIC` 
FROM `myTable`
HAVING `IS_NUMERIC` = 1

3
내가 오해하지 않는 한, MySQL은 문자열을 0으로 변환하므로 문자열과 숫자를 구별하지 않으며 둘 다 동일하게 반환됩니다.
Ivan McA

3
'a' + 0 = 'a'TRUE
Paul Spiegel

3

추천 : 검색이 간단하면`

column*1 = column

`연산자 흥미 :)는 varchar / char 필드보다 작동하고 빠릅니다.

SELECT * FROM myTable WHERE column * 1 = 열;

ABC*1 => 0 (NOT EQU **ABC**)
AB15*A => 15 (NOT EQU **AB15**)
15AB => 15 (NOT EQU **15AB**)
15 => 15 (EQUALS TRUE **15**)

1
MySQL에서 select 'aaa123' >= 0and를 모두 select '123aaa' >= 0반환 한다는 것을 알고 있습니까?
Grzegorz Smulko

1
SELECT * FROM myTable WHERE sign (col1)!=0

물론 sign (0)은 0이지만 쿼리를 다음으로 제한 할 수 있습니다.

SELECT * FROM myTable WHERE sign (col1)!=0 or col1=0

업데이트 : 이것은 100 % 신뢰할 수 없습니다. "1abc"는 1의 부호를 반환하지만 "ab1c"는 0을 반환하므로 숫자로 시작하지 않는 텍스트에만 작동합니다.


0

당신은 사용할 수 있습니다 CAST

  SELECT * from tbl where col1 = concat(cast(col1 as decimal), "")


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