Ответ 1
Используйте Not Like
where some_column NOT LIKE '%[^0-9]%'
Demo
declare @str varchar(50)='50'--'asdarew345'
select 1 where @str NOT LIKE '%[^0-9]%'
Я работаю в SQL Server 2008. Я пытаюсь проверить, имеет ли строка (varchar) только цифры (0-9). Я знаю, что функция IS_NUMERIC может давать ложные результаты. (Мои данные могут иметь знаки $, которые не должны проходить тест.) Итак, я избегаю этой функции.
У меня уже есть тест, чтобы увидеть, имеет ли строка какие-либо нецифровые символы, т.е.
some_column LIKE '%[^0123456789]%'
Я бы подумал, что тест с единственными цифрами будет чем-то подобным, но я рисую пробел. Любые идеи?
Используйте Not Like
where some_column NOT LIKE '%[^0-9]%'
declare @str varchar(50)='50'--'asdarew345'
select 1 where @str NOT LIKE '%[^0-9]%'
Существует системная функция ISNUMERIC для SQL 2008 и выше. Пример:
SELECT myCol
FROM mTable
WHERE ISNUMERIC(myCol)<> 1;
Я сделал несколько быстрых тестов, а также посмотрел дальше в документы:
ISNUMERIC returns 1 when the input expression evaluates to a valid numeric data type; otherwise it returns 0.
Это означает, что он достаточно предсказуем, например,
-9879210433
будет проходить, но 987921-0433
не будет.
$9879210433
будет проходить, но 9879210$433
не делает.
Таким образом, используя эту информацию, вы можете избавиться на основе списка допустимых символов валюты и +
и -
символов.
Решение: where some_column NOT LIKE '%[^0-9]%'
является правильным.
Только одно важное замечание: добавьте проверку, когда строка column = ''
(пустая строка). Этот сценарий вернет, что ''
является допустимым числом.
DECLARE @x int=1
declare @exit bit=1
WHILE @x<=len('123c') AND @exit=1
BEGIN
IF ascii(SUBSTRING('123c',@x,1)) BETWEEN 48 AND 57
BEGIN
set @[email protected]+1
END
ELSE
BEGIN
SET @exit=0
PRINT 'string is not all numeric -:('
END
END