我正在开发 SQL Server 2016 存储过程,我想获取varchar(38)
列的最后一个字符。
我知道总会有至少 18 个字符,而且我不知道列的确切长度,因为它是可变的。
我想我可以得到列的长度并做一个减法来使用SUBSTRING
,但我不能这样做,因为我正在这样做:
set @externalCodes = (
select Serial, AggregationLevel
from ExternalCode where ProductionOrderId = @productionOrderId
for json path
我正在生成一个 JSON,但我不知道如何获取Serial
选择中每列的长度。
我的问题是:如何在不知道其长度的情况下从没有前 18 个字符的字符串中获取子字符串?
一种解决方案可能是:
SUBSTRING(Serial, 18, 38)
它总是返回从 18 到字符串末尾的子字符串,即使字符串的长度不是 38。
您的
SUBSTRING
解决方案似乎足够好,我不确定您为什么需要更多要求。我只想指出,如果你想跳过前 18 个字符,那么你应该将 19 指定为 的第二个参数SUBSTRING
,因为在 SQL 中,字符串中的字符位置从 1 开始。所以这很有意义并且应该很好用为你:如果您指定 18,那么您将跳过 17 个字符。
George.Palacios 建议的使用
RIGHT
andLEN
的解决方案也可以,但是这两个解决方案的结果可能不同,具体取决于是否可以有尾随空格。可能存在差异的原因是该函数忽略尾随空格,而没有,这意味着对于带有尾随空格的字符串,结果很可能不是您所期望的。Serial
LEN
RIGHT
让我用一个较短字符串的简单示例来演示一下。假设最大长度为 10,要跳过的字符数为 4,具体字符串为
'abcde '
. (这里的引号只是字符串分隔符,以便您能够看到尾随空格。)如果您这样做您将得到
'e '
结果,因为SUBSTRING
将简单地从第 5 个字符开始剪切字符串,并包含直到字符串末尾的所有字符。相比之下,
RIGHT
/LEN
选项将产生
' '
。该LEN
函数将忽略两个尾随空格并返回 5。从 5 中减去 4 得到 1,因此RIGHT
将只返回字符串最右边的一个字符,即一个空格。但是,正如我所说,如果
Serial
永远不能有尾随空格,那么任何一个选项都可以。为了完整起见,让我再推荐一个,它使用该STUFF
函数:该
STUFF
函数允许您从给定位置的给定字符串中删除子字符串和/或插入另一个子字符串。因此,为了使用此函数跳过 18 个字符,您需要指定起始位置 1、要删除的 18 个字符和一个空字符串 (''
) 来替换它们。就像SUBSTRING
,如果您需要考虑尾随空格,此解决方案将正确使用尾随空格。我会使用:
这将获取字段的长度并从中减去 18,留下第 18 个字符之后的所有内容。