我需要返回具有一系列序列号的匹配项,但是前缀和后缀需要删除。
即。我需要在下面的序列号之间搜索,但序列号只是中间部分。
G4A41103801702 - G4A41113171702
G4A 4110380 1702 - G4A 4111317 1702
我需要排除前3位和最后4位数,然后在4110380-4111317之间搜索。
谢谢
发布于 2019-01-17 16:25:24
baton,尝试以下查询的变体:
用要选择的列替换id。
用实际的表名替换tablename。
假设serialnumber是要查询的串行列的名称。
假设序列号的长度是常数。
SELECT id FROM tablename WHERE
CAST(SUBSTRING(serialnumber, 4, 7) as int) >= 4110380 AND
CAST(SUBSTRING(serialnumber, 4, 7) as int) <= 4111317正如@ADyson所提到的,这不会利用索引,您应该将这个数字提取到单独的索引列中,以便进行更好的查询。希望这能有所帮助!
发布于 2019-01-17 16:37:56
如果长度不是常数,则可以将reverse函数组合两次以排除first 3和last 4数字:
SELECT id FROM tablename WHERE
substring(reverse(substring(reverse(serialnumber),5)),4) >= 4110380 AND
substring(reverse(substring(reverse(serialnumber),5)),4) <= 4111317测试:
substring(reverse(substring(reverse('G4A41103801702'),5)),4) ==> '4110380'发布于 2019-01-17 19:21:08
我会这样处理:
-- Sample data
DECLARE @table TABLE (col1 VARCHAR(100));
INSERT @table (col1)
VALUES ('G4A41103801702 - G4A41113171702');
-- solution
SELECT
c1=SUBSTRING(s.s1,PATINDEX(p.P,s.s1),7),
c2=SUBSTRING(s.s2,PATINDEX(p.P,s.s2),7)
FROM @table AS t
CROSS JOIN (VALUES('%'+REPLICATE('[0-9]',7)+'%')) AS p(P)
CROSS APPLY (VALUES(CHARINDEX('-',t.col1))) AS br(b)
CROSS APPLY (VALUES(SUBSTRING(t.col1,1,br.b-1),
SUBSTRING(t.col1,br.b+1,8000))) AS s(s1,s2);返回:
c1 c2
------- -------
4110380 4111317然后,您可以在其他地方使用c1和c2。
https://stackoverflow.com/questions/54240111
复制相似问题