Sql 将作业编号作为字符串的一部分使用的有效方法
使用sql2008r2 我们有几个系统,所有饲料生产过程。我们从这些报告中得到报告,需要按作业确定成本。我们从一些流程中获得的参考编号都是VARCHAR,它们可能以作业编号开始,也可能不以作业编号开始(例如,生产作业或非生产作业)。在许多情况下,我们无法控制引用字段的格式 例如: “五万份工作”是第五万份工作 “50001\u不同的工作”是第50001号工作 “100_TGE”是非生产作业。我只知道这一点,因为100不是一个生产作业不(太短)。会有一些错误识别的百分比非常小,所以我们可以接受它 从这些我必须弄清楚什么是生产工作。我每年都会有一份有效工作编号表,因此2014年是50000到85000,2015年是85001到120000 因此,我必须:Sql 将作业编号作为字符串的一部分使用的有效方法,sql,Sql,使用sql2008r2 我们有几个系统,所有饲料生产过程。我们从这些报告中得到报告,需要按作业确定成本。我们从一些流程中获得的参考编号都是VARCHAR,它们可能以作业编号开始,也可能不以作业编号开始(例如,生产作业或非生产作业)。在许多情况下,我们无法控制引用字段的格式 例如: “五万份工作”是第五万份工作 “50001\u不同的工作”是第50001号工作 “100_TGE”是非生产作业。我只知道这一点,因为100不是一个生产作业不(太短)。会有一些错误识别的百分比非常小,所以我们可以接受它
SELECT LEFT(Reference,(CHARINDEX('_',Reference)-1)) -- need to work with 5 and 6 digit nos
我有一个UDF(性能杀手)来测试它是否真的是int
如果我使用内部联接,我想3和4可以合并
所以我只剩下
Select reference from log
Inner join jobs on jobs.jobno = IsReallyInt(LEFT(log.Reference,(CHARINDEX('_',log.Reference)-1)))
性能不会是一流的
这些参考涉及多个不同的第三方和内部DB。在某些情况下,我们可以添加计算列,以将作业编号隔离在其自己的字段中,但有些无法修改
有人有更有效的方法吗
问候
标记这是您的查询:
Select reference
from log Inner join
jobs
on jobs.jobno = IsReallyInt(LEFT(log.Reference, CHARINDEX('_', log.Reference) - 1))
IsReallyInt()
是不必要的。您可以使用“不象“[^0-9]%”。但是,我认为实际上不需要提取整数。您可以直接与职务编号进行比较。那么,试试这个:
Select reference
from log Inner join
jobs
on log.Reference like jobs.jobno + '[_]%'
这也是一个性能猪。但是,它可能会利用
log.reference
上的索引,参考表是什么样子的?不幸的是,有几个表有不同的格式(因为有多个系统)。它们基本上都有时间、物料代码、操作时间等。