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) 应该足够了。
好的,所以我有一个 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) 应该足够了。