SQL, чтобы определить, является ли строка числовыми символами, за которыми следуют буквенные символы

Можно ли определить, представляет ли строка числовые символы, за которыми следуют буквенные символы?

например «123AB» допустимо, «4.5 CD» также допустимо, «CDE3» — нет. «4d9» недействительно.

declare @t table (my_string varchar(10))

insert @t 
select '1.23bc' union -- Valid
select '4 d' union -- Valid
select 'a1' -- Invalid

select 'my_magic_expression' 
from @t

Желаемый результат:

  • Да
  • Да
  • Нет

Почему 2CDE недействителен? Это числовой символ (2), за которым следуют буквенные символы (CDE).

Thom A 27.08.2024 17:35

Был ли у вас когда-нибудь такой узор, как 4d9? Если да, то считаете ли вы это действительным или нет?

Isolated 27.08.2024 17:38

Упс @ThomA исправил, спасибо

TDP 27.08.2024 17:40

Под «цифровыми символами» вы подразумеваете только цифры от 0 до 9 или другие знаки, которые могут принадлежать числу, например точку?

Jonas Metzler 27.08.2024 17:41

4d9 недействительно, добавлено пояснение @Isolated

TDP 27.08.2024 17:41

@JonasMetzler десятичные дроби разрешены. например 1,5G разрешено

TDP 27.08.2024 17:43

Хорошо, но .5G не пустят?

Jonas Metzler 27.08.2024 17:45

Это правильная интерпретация: Starts numeric (decimals ok) followed ONLY by alpha.

Isolated 27.08.2024 17:48

Я вижу, что игра с мячом изменилась между тем, когда я написал решение кода, завершил тестирование и написал объяснение для его публикации... На данный момент требования и публикация явно противоречат друг другу...

Thom A 27.08.2024 17:48

Будет ли '-17e5 abc' «действительным»?..? Он начинается с допустимого числа (-1700000 в качестве показателя степени), за которым следуют только буквенные символы.

Thom A 27.08.2024 17:51

Судя по разделу комментариев, этот вопрос явно нуждается в обновлении со всеми включенными случаями.

Ergest Basha 27.08.2024 17:53
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
3
11
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

В T-SQL это сделать не так-то просто; у него нет поддержки Regex, есть только повторное сопоставление с образцом. При этом вы можете добиться этого, проверив, что следующие «правила» верны:

  1. Строка начинается с цифры и заканчивается буквой.
  2. Строка содержит только цифры, буквы и пробелы.
  3. Единственные символы, которые появляются после первого нецифрового символа, — это буквы и пробелы.

Это дает что-то вроде следующего:

DECLARE @t table (MyString varchar(10));

INSERT INTO @t (MyString)
VALUES('123AB'),
      ('45 CD'),
      ('3CDE'),
      ('123bc'),
      ('4 d'),
      ('CDE3'),
      ('4d9'),
      ('a1');

SELECT CASE WHEN MyString LIKE '[0-9]%[A-z]'
             AND MyString NOT LIKE '%[^0-9 A-z]%'
             AND STUFF(MyString,1,PATINDEX('%[^0-9]',MyString),'') NOT LIKE '%[0-9]%' THEN 1 ELSE 0
       END,
       MyString
FROM @t;

Решение кода было написано до комментариев, которые обозначают, что допустимы не только цифры и буквы. Этот ответ основан на сообщении на момент написания ответа, которое, вероятно, теперь изменится.

Вы ответили на исходный вопрос, спасибо. Я могу воспользоваться вашим ответом, он дал мне необходимую информацию

TDP 28.08.2024 11:31

Это гарантирует, что у вас есть как цифры, так и буквы, и что ни один из них не будет отображаться не в желаемом порядке:

    my_string     like '%[0-9]%[A-Z]%' -- outer wildcards might not be needed here
and my_string not like '%[A-Z]%[0-9]%'

Для простоты я использовал только заглавные буквы. При необходимости добавьте другие диапазоны символов. Могут существовать и другие, но неустановленные правила, например, может ли . появляться более одного раза и допустимы ли пробелы. Это выражение необходимо расширить для более строгой фильтрации.

https://dbfiddle.uk/woME8gI7

Не уверен, что это правильно: '1&apple4b' в этом случае будет «приемлемой» строкой.

Thom A 27.08.2024 18:32

@ThomA Моя ошибка заключалась в том, что я забыл, что в отличие от регулярных выражений нам нужно дополнять дополнительные подстановочные знаки.

shawnt00 27.08.2024 23:14

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