[mysql] MySQL에서 값이 숫자인지 감지

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

SELECT *
FROM myTable
WHERE isANumber(col1) = true



답변

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

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

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

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

답변

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

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

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


답변

데이터가 ‘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’


답변

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

데모


답변

숫자 행을 반환

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

SELECT * FROM myTable WHERE col1 > 0;

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

숫자가 아닌 행을 반환

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

SELECT * FROM myTable WHERE !col1 > 0;


답변

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

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


답변

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');

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