Как проверить, что строка является числовой, используя Regex в SQL Server?

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?

%^ ...$% мне кажется немного противоречивым.
derpirscher 28.06.2019 09:10
ISNUMERIC() не поможет, как вы уже сказали, вместо этого вы можете использовать TRY_CAST() / TRY_CONVERT(). Без необходимости Regex.
Ilyes 28.06.2019 09:16

как насчет удалить. и цифры, а затем посмотреть, что в строке осталось...

Tony Hopkinson 28.06.2019 09:35

Какова конечная цель здесь? Почему вы проверяете, что строка имеет этот шаблон? Это для того, чтобы определить, будет ли он приводить к numeric без ошибок или по какой-то другой причине?

Martin Smith 28.06.2019 09:58

Проблема в том, что SQL Server не поддерживает регулярные выражения. В то время как вы можете сопоставлять отдельные символы с диапазоном [0-9] или устанавливать [01234], вы не можете использовать + или * для совпадения с их инстинктивным количеством. То есть что-то вроде [0-9]+ будет соответствовать 1+, но не 123. Так что вам лучше всего ответить @Sami и добавить несколько дополнительных тестов, чтобы исключить, например, +123 или -1.5

derpirscher 28.06.2019 10:12

SQL Server не предлагает готовую поддержку регулярных выражений, но, тем не менее, регулярное выражение в вопросе недостаточно хорошее, поскольку оно будет считать строки, такие как 4.23E-8, не числами, что явно неверно.

Zohar Peled 28.06.2019 11:03

Вопрос, который еще никто не задавал: почему вы вообще используете nvarchar(50) для хранения чисел? Используйте соответствующий тип данных, и все ваши проблемы исчезнут.

Zohar Peled 28.06.2019 11:11
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
7
633
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать 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.

derpirscher 28.06.2019 09:50

Попробуйте `('+0'), ('$0'), ('-0') ` единственная разница с ISNUMERIC в ('$0')

Serg 28.06.2019 09:53

@derpirscher 1-й ОП не утверждает, что в своем вопросе, 2-й -11 это не число??? Откуда тебе это пришло в голову? Нет отрицательных/положительных чисел?

Ilyes 28.06.2019 09:55

Для конкретных примеров строк, которые они дали, это дает желаемый эффект. rextester.com/VJX9909

Martin Smith 28.06.2019 09:56

@Sami цитирует вопрос оператора: «подтвердить мое числовое значение, которое должно разрешать только числа и точки». Да -11 — это число, но OP не хочет его разрешать, по крайней мере, насколько я понимаю его вопрос (и его начальное регулярное выражение, которое не содержат отрицательный знак)

derpirscher 28.06.2019 09:56

Другие вопросы по теме