2010-05-03 4 views

ответ

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 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) 
5

В моем случае мне просто нужно проверить, если данные были> = 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 | 
+--------+ 
1

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

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)

+0

Благодарим за решение проблемы, но была опечатка. Измените следующее: SET idx = REPLACE (val, ".", ""); для SET val = REPLACE (val, ".", ""); Затем он работает как магия. – 2011-06-07 08:53:56

+0

@Raj - Я пошел вперед и удалил эту линию. Я не думаю, что это помогает.Так или иначе, он просто удаляется в цикле «WHILE». – VenerableAgents

1

Просто конвертировать ваши данные в явном виде в ряд с помощью 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; 
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; 
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 ; 

 Смежные вопросы

  • Нет связанных вопросов^_^