因此,我得到的结果以2个字母开头,后跟3个数字,例如:
ID_Sample
AB001
BC003
AB100
BC400
我该如何执行忽略字母的查询,而只是查找数字以进行过滤?例如:
WHERE ID_Sample >= 100
我尝试使用“替换”来摆脱已知字母,但是我认为可能会有更好的方法。例如:
Select
Replace(id_sample,'AB','')
选择右侧的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