Чи є спосіб визначити, чи є значення числом у запиті MySQL? Як от
SELECT *
FROM myTable
WHERE isANumber(col1) = true
Чи є спосіб визначити, чи є значення числом у запиті MySQL? Як от
SELECT *
FROM myTable
WHERE isANumber(col1) = true
Відповіді:
Це повинно працювати в більшості випадків.
SELECT * FROM myTable WHERE concat('',col1 * 1) = col1
Це не працює для нестандартних номерів, як-от
1e4
1.2e5
123.
(кінцевий десятковий)Ви також можете використовувати Regular Expression ... це було б так:
SELECT * FROM myTable WHERE col1 REGEXP '^[0-9]+$';
WHERE col1 NOT REGEXP...
а для випадку, коли у вас може бути десяткова крапка, використовуйте регулярний вираз:^[0-9\.]+$
Якщо ваші дані 'test', 'test0', 'test1111', '111test', '111'
Щоб вибрати всі записи, де дані є простим цілим:
SELECT *
FROM myTable
WHERE col1 REGEXP '^[0-9]+$';
Результат: '111'
(У регулярному виразі ^ означає початок, а $ означає кінець)
Щоб вибрати всі записи, де існує ціле чи десяткове число:
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;
Цей запит повертає рядки, що мають лише більший нульовий стовпчик числа col1
Повертає нечислові рядки
якщо ви хочете перевірити стовпець не числовим, спробуйте цей фокус ( !col1 > 0
):
SELECT * FROM myTable WHERE !col1 > 0;
SELECT * FROM myTable WHERE col1 = 123;
запит поверне рядки, рівне значення знаку123abc
використовувати 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
вибрати таблицю (mycol) mycol1, col2, colx з tablex; - поверне 1s та 0s для стовпця mycol1
- ви можете вдосконалити функцію прийому десяткових знаків, наукових позначень тощо ...
Перевага використання 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'
ІСТИНА
Я рекомендую: якщо ваш пошук простий, ви можете використовувати `
column*1 = column
`Оператор цікавий :) - робота і швидша, ніж на полях varchar / char
ВИБІР * ІЗ myTable WHERE стовпчик * 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
і select '123aaa' >= 0
повернути істину?
SELECT * FROM myTable WHERE sign (col1)!=0
Знак курсу (0) дорівнює нулю, але тоді ви можете обмежити запит на ...
SELECT * FROM myTable WHERE sign (col1)!=0 or col1=0
ОНОВЛЕННЯ: Це не на 100% надійно, тому що "1abc" поверне знак 1, але "ab1c" поверне нуль ... так що це може працювати лише для тексту, який не починається з цифр.
Спробуйте розділити / 1
select if(value/1>0 or value=0,'its a number', 'its not a number') from table