Oracle,从右边开始的子串然后向左填充,奇怪的行为

Oracle, substring from right then pad left, odd behavior

好的,所以我有一个 ASN_NO,它可以是 30 个字符。

我需要选出最右边的 10 个字符。没问题。

SUBSTR(ASN_NO,-10, 10) -- this works fine

但有时 ASN_NO 可能少于 10 个字符,在这种情况下我需要用左零填充它。

LPAD(ASN_NO,10,'0') -- this works when less than 10 characters, except when having an ASN_NO greater it substrings from the left

那么如果我尝试将它们结合使用

LPAD(SUBSTR(ASN_NO,-10, 10),10,'0') -- this gives me a null result when less than 10 but i dont understand why?

然后我想到了这个:

LPAD(SUBSTR(ASN_NO, CASE WHEN LENGTH(SI.ASN_NO) >= 10 THEN -10 ELSE -LENGTH(ASN_NO) END, 10),10,'0') 

当长度小于 10 时,最后一条语句将长度与子字符串结合使用……但我是不是工作过度了 this/over 这么想?有谁知道更干净的方法是什么?

当您要求输入少于 10 个字符的字符串的最后 10 个字符时,您会得到 NULL。

您需要先 LPAD 然后再 SUBSTR。

当您想获取所有字符时,SUBSTR 的第二个参数 (LENGTH) 也已过时。

你可以使用nvl函数,会是这样的:

lpad(nvl(SUBSTR(ASN_NO,-10),asn_no),10,'0')

如果长度小于 10,则 SUBSTR(ASN_NO,-10) return 为空,因此在这种情况下,nvl 函数将 return 整个字符串。

请注意,您不需要指定第三个参数来获取最后 10 个字符,substr(ASN_NO,-10) 应该足够了。