Можно ли определить, представляет ли строка числовые символы, за которыми следуют буквенные символы?
например «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
Желаемый результат:
Был ли у вас когда-нибудь такой узор, как 4d9
? Если да, то считаете ли вы это действительным или нет?
Упс @ThomA исправил, спасибо
Под «цифровыми символами» вы подразумеваете только цифры от 0 до 9 или другие знаки, которые могут принадлежать числу, например точку?
4d9 недействительно, добавлено пояснение @Isolated
@JonasMetzler десятичные дроби разрешены. например 1,5G разрешено
Хорошо, но .5G
не пустят?
Это правильная интерпретация: Starts numeric (decimals ok) followed ONLY by alpha
.
Я вижу, что игра с мячом изменилась между тем, когда я написал решение кода, завершил тестирование и написал объяснение для его публикации... На данный момент требования и публикация явно противоречат друг другу...
Будет ли '-17e5 abc'
«действительным»?..? Он начинается с допустимого числа (-1700000
в качестве показателя степени), за которым следуют только буквенные символы.
Судя по разделу комментариев, этот вопрос явно нуждается в обновлении со всеми включенными случаями.
В T-SQL это сделать не так-то просто; у него нет поддержки Regex, есть только повторное сопоставление с образцом. При этом вы можете добиться этого, проверив, что следующие «правила» верны:
Это дает что-то вроде следующего:
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;
Решение кода было написано до комментариев, которые обозначают, что допустимы не только цифры и буквы. Этот ответ основан на сообщении на момент написания ответа, которое, вероятно, теперь изменится.
Вы ответили на исходный вопрос, спасибо. Я могу воспользоваться вашим ответом, он дал мне необходимую информацию
Это гарантирует, что у вас есть как цифры, так и буквы, и что ни один из них не будет отображаться не в желаемом порядке:
my_string like '%[0-9]%[A-Z]%' -- outer wildcards might not be needed here
and my_string not like '%[A-Z]%[0-9]%'
Для простоты я использовал только заглавные буквы. При необходимости добавьте другие диапазоны символов. Могут существовать и другие, но неустановленные правила, например, может ли .
появляться более одного раза и допустимы ли пробелы. Это выражение необходимо расширить для более строгой фильтрации.
Не уверен, что это правильно: '1&apple4b'
в этом случае будет «приемлемой» строкой.
@ThomA Моя ошибка заключалась в том, что я забыл, что в отличие от регулярных выражений нам нужно дополнять дополнительные подстановочные знаки.
Почему
2CDE
недействителен? Это числовой символ (2
), за которым следуют буквенные символы (CDE
).