首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >server,在具有文本预/后缀的数字之间

server,在具有文本预/后缀的数字之间
EN

Stack Overflow用户
提问于 2019-01-17 16:19:20
回答 3查看 619关注 0票数 0

我需要返回具有一系列序列号的匹配项,但是前缀和后缀需要删除。

即。我需要在下面的序列号之间搜索,但序列号只是中间部分。

G4A41103801702 - G4A41113171702

G4A 4110380 1702 - G4A 4111317 1702

我需要排除前3位和最后4位数,然后在4110380-4111317之间搜索。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-01-17 16:25:24

baton,尝试以下查询的变体:

用要选择的列替换id

用实际的表名替换tablename

假设serialnumber是要查询的串行列的名称。

假设序列号的长度是常数。

代码语言:javascript
复制
SELECT id FROM tablename WHERE
CAST(SUBSTRING(serialnumber, 4, 7) as int) >= 4110380 AND
CAST(SUBSTRING(serialnumber, 4, 7) as int) <= 4111317

正如@ADyson所提到的,这不会利用索引,您应该将这个数字提取到单独的索引列中,以便进行更好的查询。希望这能有所帮助!

票数 3
EN

Stack Overflow用户

发布于 2019-01-17 16:37:56

如果长度不是常数,则可以将reverse函数组合两次以排除first 3last 4数字:

代码语言:javascript
复制
SELECT id FROM tablename WHERE
substring(reverse(substring(reverse(serialnumber),5)),4) >= 4110380 AND
substring(reverse(substring(reverse(serialnumber),5)),4) <= 4111317

测试:

代码语言:javascript
复制
substring(reverse(substring(reverse('G4A41103801702'),5)),4) ==> '4110380'
票数 0
EN

Stack Overflow用户

发布于 2019-01-17 19:21:08

我会这样处理:

代码语言:javascript
复制
-- 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);

返回:

代码语言:javascript
复制
c1      c2
------- -------
4110380 4111317

然后,您可以在其他地方使用c1和c2。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54240111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档