Фильтровать идентификаторы только с цифрами, исключая буквы - PullRequest
0 голосов
/ 02 октября 2019

Итак, у меня есть результаты, которые начинаются с 2 букв, за которыми следуют 3 цифры, например:

ID_Sample
AB001
BC003
AB100
BC400

Как я могу выполнить запрос, который игнорирует буквы и просто ищет цифры, чтобы выполнить фильтр? Например:

WHERE ID_Sample >= 100

Я пытался использовать «Заменить», чтобы избавиться от известных букв, но я подумал, что может быть лучший способ. Например:

Select
   Replace(id_sample,'AB','')

Выбор 3 цифр справа тоже подойдет.

Ответы [ 3 ]

2 голосов
/ 02 октября 2019

Для ваших примеров данных вы можете просто начать с третьего символа и преобразовать его в число:

where try_convert(int, stuff(ID_Sample, 1, 2, '')) > 100

Или, если вы знаете, что число составляет 3 символа:

where try_convert(int, right(ID_Sample, 3)) > 100
1 голос
/ 02 октября 2019

Проверьте эти методы - также проведен юнит-тест!

Declare @Table as table(ID_Sample varchar(20))

set nocount on

Insert into @Table (ID_Sample)
Values('AB001'),('BC003'),('AB100'),('BC400')

--substring_method
select * from @Table 
where try_cast(substring(ID_Sample,3,3) as int) >100

--right_method
select * from @Table 
where try_cast(right(ID_Sample,3) as int) >100

--stuff_method
select * from @Table 
where try_cast(stuff(ID_Sample,1,2,'') as int) >100

--replace_method
select * from @Table 
where try_cast(replace(ID_Sample,left(ID_Sample,2),'') as int) >100
1 голос
/ 02 октября 2019

+ 1 за ответ Гордона. Это забавная проблема, которую вы можете решить, используя TRANSLATE , если вы используете SQL 2017+.

Во-первых, если вы никогда не использовали его, Per BOL TRANSLATE:

Возвращает строку, предоставленную в качестве первого аргумента после некоторых указанных символовво втором аргументе переводятся в набор символов назначения, указанный в третьем аргументе. 2

This:

SELECT TRANSLATE('123AABBCC!!!','ABC','XYZ');

Возвращает: 123XXYYZZ !!!

Вот решение с использованием TRANSLATE:

-- Sample Data
DECLARE @t TABLE (ID_Sample CHAR(6))
INSERT @t (ID_Sample) VALUES ('AB001'),('BC003'),('AB100'),('BC400'),('CC555');

-- Solution
SELECT 
  ID_Sample     = t.ID_Sample,
  ID_Sample_Int = s.NewString
FROM         @t AS t
CROSS JOIN  (VALUES('ABCDEFGHIJKLMNOPQRSTUVWXYZ', REPLICATE(0,26)))     AS f(S1,S2)
CROSS APPLY (VALUES(TRY_CAST(TRANSLATE(t.ID_Sample,f.S1,f.S2) AS INT))) AS s(NewString)
WHERE        s.NewString >= 100;

Без фильтра предложений WHERE вы получите:

ID_Sample ID_Sample_Int
--------- -------------
AB001     1
BC003     3
AB100     100
BC400     400
CC555     555

... предложение WHERE отфильтровывает первые две строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...