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

时间:2015-05-15 17:09:07

标签: oracle substr

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

我需要拍摄10个最正确的角色。没问题。

// Create the Google Api Client with access to Plus and Games
mGoogleApiClient = new GoogleApiClient.Builder(getApplicationContext())
    .addConnectionCallbacks(this)
    .addOnConnectionFailedListener(this)
    .addApi(Plus.API).addScope(Plus.SCOPE_PLUS_LOGIN)
    .addApi(Games.API).addScope(Games.SCOPE_GAMES)
    .build();

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

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

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

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?

这个最后一个声明使用长度与子串一起使用时少于10个有效...但是我是否过度使用这个/过度思考这个?任何人都知道什么是更清洁的方式?

2 个答案:

答案 0 :(得分:1)

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

首先需要LPAD,然后再需要SUBSTR。

当你想让所有角色一直到最后时,SUBSTR的第二个参数(LENGTH)已经过时了。

答案 1 :(得分:1)

您可以使用nvl功能,例如:

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

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

作为一个注释,你不需要指定第三个参数来获得最后10个字符,substr(ASN_NO,-10)就足够了。