Имеет ли mysql funcion, например is_num(), который может позволить мне определить, что данные являются числовыми или нет?Как только выбрать числовые данные из mysql?
Спасибо.
Имеет ли mysql funcion, например is_num(), который может позволить мне определить, что данные являются числовыми или нет?Как только выбрать числовые данные из mysql?
Спасибо.
Вы можете создать определенную пользователем функцию, которая соответствует значению с регулярным выражением:
CREATE FUNCTION IsNumeric (sIn varchar(1024)) RETURNS tinyint
RETURN sIn REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$';
Источник: MySQL Forums :: Microsoft SQL Server :: IsNumeric() clause in MySQL?
Truthy Тесты:
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)
Falsy Тесты:
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)
В моем случае мне просто нужно проверить, если данные были> = 0, а не символ, может быть, это полезно для вас также:
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 |
+--------+
Если вы хотите выбрать только цифровые символы из вашей строки , попробуйте использовать это:
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"
(Кстати, я написал post about this here)
Просто конвертировать ваши данные в явном виде в ряд с помощью DECIMAL или ПОДПИСАЛ/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;
Простой синтаксис для 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;
тысяч раз быстрее.
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 ;
Благодарим за решение проблемы, но была опечатка. Измените следующее: SET idx = REPLACE (val, ".", ""); для SET val = REPLACE (val, ".", ""); Затем он работает как магия. – 2011-06-07 08:53:56
@Raj - Я пошел вперед и удалил эту линию. Я не думаю, что это помогает.Так или иначе, он просто удаляется в цикле «WHILE». – VenerableAgents