2017-03-06 91 views
2

我有一系列零件号码,通常只有10个字符,但有时在开始时会包含额外的2或3个字符。除了最后5个只包含大小信息的字符之外,我想要列出所有这些部分的清单。很明显,一个简单的子字符串不起作用,据我所知,它与允许指定字符范围的rtrim()不相似。我在下面发布了我的解决方案,但我认为这有点草率,想知道是否有更好的方法?从字符串末尾开始获取长度不确定的子字符串

SELECT 
    DISTINCT REVERSE(SUBSTRING(REVERSE(P.ID),6,LEN(P.ID))), 
    P.DESCRIPTION 
FROM REQUIREMENT R 
INNER JOIN OPERATION O ON 
    R.WORKORDER_BASE_ID = O.WORKORDER_BASE_ID AND 
    R.WORKORDER_LOT_ID = O.WORKORDER_LOT_ID AND 
    R.WORKORDER_SUB_ID = O.WORKORDER_SUB_ID 
INNER JOIN PART P ON 
    P.ID = R.PART_ID 
    WHERE O.RESOURCE_ID LIKE '%17%' 
    AND P.ID LIKE '%[0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9][0-9]' 
    AND P.DESCRIPTION NOT LIKE '%OBS%' 
    AND O.STATUS_EFF_DATE > GETDATE() - 365*2 
+2

'Left(value,len(value) - 5)'有什么问题? –

+0

绝对没有。我不敢相信我没有想到这一点。谢谢! – mreff555

+0

你真的应该使用DATEADD(year,-2,GETDATE())来代替你的简写数学。它更清晰,准确,不易出现数据类型错误。 http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad-habits-to-kick-using-shorthand-with-date-time-operations.aspx –

回答

4

你说过这个的方式,是你想剥离掉最后五个字符。有两种方法可以做到这一点。其中一个,除了最后五个字符外,其余的就是使用REVERSE,拉开前5个,再次倒退。你在你的例子中做了后者,但这是另一种选择:

SELECT SUBSTRING(@string, 1, LEN(@string) - 5) 

这不是你想要的吗?

+0

它是。谢谢。再一次,我不确定为什么我不这么认为。 – mreff555

相关问题