过滤仅包含数字(不包括字母)的ID

时间:2019-10-01 22:54:24

标签: sql sql-server tsql

因此,我得到的结果以2个字母开头,后跟3个数字,例如:

ID_Sample
AB001
BC003
AB100
BC400

我该如何执行忽略字母的查询,而只是查找数字以进行过滤?例如:

WHERE ID_Sample >= 100

我尝试使用“替换”来摆脱已知字母,但是我认为可能会有更好的方法。例如:

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

选择右侧的3个数字也可以。

3 个答案:

答案 0 :(得分:2)

对于示例数据,您只需从第三个字符开始并转换为数字:

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

或者,如果您知道数字是3个字符:

where try_convert(int, right(ID_Sample, 3)) > 100

答案 1 :(得分:1)

+1代表戈登的答案。这是一个有趣的问题,如果您使用的是SQL 2017+,则可以使用TRANSLATE解决。

首先,如果您从未使用过它,请按BOL TRANSLATE

  

在某些字符后返回作为第一个参数提供的字符串   第二个参数中指定的内容将转换为目标集   第三个参数中指定的字符数。2

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子句过滤掉前两行。

答案 2 :(得分:1)

检查这些方法-单元测试也完成了!

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