Как выбрать только числовые данные из mysql?

Есть ли в mysql такая функция, как is_num(), которая позволяет мне определить, являются ли данные числовыми или нет?


person user295515    schedule 03.05.2010    source источник


Ответы (6)


Вы можете создать пользовательскую функцию, которая сопоставляет значение с регулярным выражением:

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

Источник: Форумы MySQL :: Microsoft SQL Server :: IsNumeric(). в MySQL?


Правдивые тесты:

mysql> SELECT ISNUMERIC('1');
+----------------+
| ISNUMERIC('1') |
+----------------+
|              1 |
+----------------+
1 row in set (0.01 sec)

mysql> SELECT ISNUMERIC(25);
+---------------+
| ISNUMERIC(25) |
+---------------+
|             1 |
+---------------+
1 row in set (0.00 sec)

mysql> SELECT ISNUMERIC('-100');
+-----------------+
| ISNUMERIC(-100) |
+-----------------+
|               1 |
+-----------------+
1 row in set (0.03 sec)

mysql> SELECT ISNUMERIC('1.5');
+------------------+
| ISNUMERIC('1.5') |
+------------------+
|                1 |
+------------------+
1 row in set (0.00 sec)

mysql> SELECT ISNUMERIC('-1.5');
+-------------------+
| ISNUMERIC('-1.5') |
+-------------------+
|                 1 |
+-------------------+
1 row in set (0.02 sec)

Ложные тесты:

mysql> SELECT ISNUMERIC('a');
+----------------+
| ISNUMERIC('a') |
+----------------+
|              0 |
+----------------+
1 row in set (0.02 sec)

mysql> SELECT ISNUMERIC('a1');
+-----------------+
| ISNUMERIC('a1') |
+-----------------+
|               0 |
+-----------------+
1 row in set (0.00 sec)

mysql> SELECT ISNUMERIC('10a');
+------------------+
| ISNUMERIC('10a') |
+------------------+
|                0 |
+------------------+
1 row in set (0.00 sec)

mysql> SELECT ISNUMERIC('0.a');
+------------------+
| ISNUMERIC('0.a') |
+------------------+
|                0 |
+------------------+
1 row in set (0.00 sec)

mysql> SELECT ISNUMERIC('a.0');
+------------------+
| ISNUMERIC('a.0') |
+------------------+
|                0 |
+------------------+
1 row in set (0.00 sec)
person Daniel Vassallo    schedule 03.05.2010

В моем случае мне просто нужно было проверить, были ли данные> = 0, а не char, возможно, это также полезно для вас:

mysql> select '1'  REGEXP '^[0-9]+$' as result;
+--------+
| result |
+--------+
|      1 | 
+--------+
1 row in set (0.16 sec)

mysql> select '1a'  REGEXP '^[0-9]+$' as result;
+--------+
| result |
+--------+
|      0 | 
+--------+
person gonzalemario    schedule 15.05.2010

Если вы хотите выбрать только числовые символы из вашей строки, попробуйте использовать это:

CREATE FUNCTION IsNumeric (val varchar(255)) RETURNS tinyint 
 RETURN val REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$';

CREATE FUNCTION NumericOnly (val VARCHAR(255)) 
 RETURNS VARCHAR(255)
BEGIN
 DECLARE idx INT DEFAULT 0;
 IF ISNULL(val) THEN RETURN NULL; END IF;

 IF LENGTH(val) = 0 THEN RETURN ""; END IF;

 SET idx = LENGTH(val);
  WHILE idx > 0 DO
  IF IsNumeric(SUBSTRING(val,idx,1)) = 0 THEN
   SET val = REPLACE(val,SUBSTRING(val,idx,1),"");
   SET idx = LENGTH(val)+1;
  END IF;
  SET idx = idx - 1;
  END WHILE;
  RETURN val;
 END;

Используйте его, вызвав функцию NumericOnly следующим образом:

select NumericOnly('1&2') as result;

Возвращает: "12"

select NumericOnly('abc987') as result;

Возвращает: "987"

(Кстати, я написал пост об этом здесь)

person VenerableAgents    schedule 29.01.2011
comment
Спасибо за решение, но была опечатка. Измените следующее: SET idx = REPLACE(val,.,); УСТАНОВИТЬ значение = ЗАМЕНИТЬ (значение,.,); Тогда это работает как по волшебству. - person ; 07.06.2011
comment
@Raj - я удалил эту строку. Я не думаю, что это помогает. В любом случае он просто будет удален в цикле WHILE. - person VenerableAgents; 08.06.2011

Просто преобразуйте данные явно в число, используя DECIMAL или SIGNED/UNSIGNED, и используйте STRCMP для сравнения с исходным значением данных. Если STRCMP возвращает 0 (равенство), значит, у вас есть число. В противном случае это не так.

Вот пример, который предполагает, что в ваших данных нет десятичных знаков, когда они числовые, поэтому мы можем привести их к типу DECIMAL.

Этот запрос выбирает все строки, содержащие числовые данные в поле is_it_a_number.

SELECT * FROM my_table WHERE
    STRCMP(CAST(my_table.is_it_a_number AS DECIMAL(10,0)), my_table.is_it_a_number) = 0;
person Tom Auger    schedule 07.03.2013

Простой синтаксис для IsNumeric из SQL в MYSQL:

SQL:

SELECT isNumeric(col_name) FROM Table where isNumeric(col_name) <> 0

Mysql

select concat('',col_name * 1) from table where concat('',col_name * 1) <> 0;
person NiKhil Kutewalla    schedule 18.08.2016

В тысячу раз быстрее.

DROP FUNCTION IF EXISTS NumericOnly;
DELIMITER $$
CREATE FUNCTION NumericOnly(val VARCHAR(25)) RETURNS VARCHAR(25)
BEGIN
 DECLARE idx INT DEFAULT 0;
  IF ISNULL(val) THEN RETURN NULL; END IF;
  IF LENGTH(val) = 0 THEN RETURN ""; END IF;

 SET idx = LENGTH(val);
  WHILE idx > 0 DO
  IF (SUBSTRING(val,idx,1) in ('0','1','2','3','4','5','6','7','8','9')) = 0 THEN
   SET val = CONCAT(SUBSTRING(val, 1, idx-1), SUBSTRING(val FROM idx + 1));
  END IF;
  SET idx = idx - 1;
  END WHILE;
  RETURN val;
END;
$$
DELIMITER ;
person Laurent Bauchau    schedule 09.02.2018