답변:
대부분의 경우 작동합니다.
SELECT * FROM myTable WHERE concat('',col1 * 1) = col1
다음과 같은 비표준 숫자에는 작동하지 않습니다.
1e4
1.2e5
123.
(소수점)정규 표현식도 사용할 수 있습니다 ...
SELECT * FROM myTable WHERE col1 REGEXP '^[0-9]+$';
WHERE col1 NOT REGEXP...
의 경우 소수점이있을 수있는 정규식을 사용하십시오 :^[0-9\.]+$
데이터가 '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'
REGEXP '^[+\-]?[0-9]+\\.?[0-9]*$'
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;
SELECT * FROM myTable WHERE col1 = 123;
col value is123abc
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');
도움이 되었기를 바랍니다.
내 컴퓨터에서 REGEXP보다 빠른 다른 대안은
SELECT * FROM myTable WHERE col1*0 != col1;
이것은 col1이 숫자 값으로 시작하는 모든 행을 선택합니다.
AND col1<>0
그 예외를 처리하기 위해 추가 할 수 있다고 생각합니다 .
이 간단한 버전이 여전히 누락되었습니다.
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
'a' + 0 = 'a'
TRUE
추천 : 검색이 간단하면`
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**)
select 'aaa123' >= 0
and를 모두 select '123aaa' >= 0
반환 한다는 것을 알고 있습니까?