IsNumeric позволяет использовать следующие специальные символы
`SELECT ISNUMERIC('10.50') as '10.50'
ISNUMERIC('10,50') as '10,50'
,ISNUMERIC('-') as '-'
,ISNUMERIC('+') as '+'
,ISNUMERIC('$') as '$'
,ISNUMERIC('.') as '.'
,ISNUMERIC(',') as ','
,ISNUMERIC('\') as '\'`
Итак, я хотел использовать RegEx https://regexr.com/4gjhm для проверки моего числового числа, которое должно разрешать только числа и точки.
Пробовал Regex ^[0-9]+[.]{0,1}[0-9]*$ с помощью PATINDEX, но не получил ожидаемых результатов
`DECLARE @Amount As NVARCHAR(50) = '150';
SELECT CASE
WHEN @Amount LIKE '%^[0-9]+[.]{0,1}[0-9]*$%'
THEN 1
ELSE 0
END AS IsNumericResult`
Действительный пример: 10, 10.01, .20 Недопустимый пример: 10.50.20, 10..20 и т. д.
Возможно ли добиться этого с помощью LIKE или PATINDEX в SQL Server 2017?
ISNUMERIC() не поможет, как вы уже сказали, вместо этого вы можете использовать TRY_CAST() / TRY_CONVERT(). Без необходимости Regex.
как насчет удалить. и цифры, а затем посмотреть, что в строке осталось...
Какова конечная цель здесь? Почему вы проверяете, что строка имеет этот шаблон? Это для того, чтобы определить, будет ли он приводить к numeric без ошибок или по какой-то другой причине?
Проблема в том, что SQL Server не поддерживает регулярные выражения. В то время как вы можете сопоставлять отдельные символы с диапазоном [0-9] или устанавливать [01234], вы не можете использовать + или * для совпадения с их инстинктивным количеством. То есть что-то вроде [0-9]+ будет соответствовать 1+, но не 123. Так что вам лучше всего ответить @Sami и добавить несколько дополнительных тестов, чтобы исключить, например, +123 или -1.5
SQL Server не предлагает готовую поддержку регулярных выражений, но, тем не менее, регулярное выражение в вопросе недостаточно хорошее, поскольку оно будет считать строки, такие как 4.23E-8, не числами, что явно неверно.
Вопрос, который еще никто не задавал: почему вы вообще используете nvarchar(50) для хранения чисел? Используйте соответствующий тип данных, и все ваши проблемы исчезнут.


Вы можете использовать TRY_CAST() или TRY_CONVERT() без необходимости выражения Regex
SELECT CASE WHEN TRY_CAST(@Amount AS INT) IS NULL THEN 0 ELSE 1 END IsNumericResult
Вы можете изменить INT там на числовое или десятичное по мере необходимости.
например:
SELECT V Value,
CASE WHEN TRY_CAST(V AS DECIMAL(10,2)) IS NULL
THEN 0
ELSE 1
END IsNumericResult
FROM
(VALUES ('10.50'), ('+'), ('$'), ('-'), ('11')) T(V);
Вот дб <> рабочий пример, чтобы увидеть, как это работает.
Это также позволит +10.5 и -11, что недопустимо в соответствии с исходным вопросом op.
Попробуйте `('+0'), ('$0'), ('-0') ` единственная разница с ISNUMERIC в ('$0')
@derpirscher 1-й ОП не утверждает, что в своем вопросе, 2-й -11 это не число??? Откуда тебе это пришло в голову? Нет отрицательных/положительных чисел?
Для конкретных примеров строк, которые они дали, это дает желаемый эффект. rextester.com/VJX9909
@Sami цитирует вопрос оператора: «подтвердить мое числовое значение, которое должно разрешать только числа и точки». Да -11 — это число, но OP не хочет его разрешать, по крайней мере, насколько я понимаю его вопрос (и его начальное регулярное выражение, которое не содержат отрицательный знак)
%^ ...$%мне кажется немного противоречивым.