Concat / Substring

时间:2017-01-11 09:43:26

标签: sql oracle

SELECT 12345 || 0011 from dual;

Oracle中的结果显示为1234511.它正在删除零。

SELECT length(12345 || 0011) from dual;

Oracle的结果是7.它不计算零。

我正在考虑做lpad,但问题是上面传递的0011作为一个数字。实际上,它可以在程序中以2,3或4位数字形式出现。

如何在连接或查找长度时不会删除零的查询?

由于

这是来自程序......

SELECT  Count(programID)
INTO pCount
FROM program
WHERE SUBSTR(PrefixA || PrefixB, 1, (LENGTH(72776 || 0906))) =   72776 ||     
0906
or PrefixA || PrefixB = SUBSTR(72776 || 0906, 1, LENGTH(PrefixA || PrefixB))
;

0906和72776来自程序调用。它可以是两位,三位或四位数字。例如:090,08,770,0906。

如果上面的数字不在程序表中,那么它应该在PCOUNT中产生一个“零”计数,但是上面的查询正在截断0,因此将数字形成为72776906,并且该组合确实存在于数据库中。

2 个答案:

答案 0 :(得分:4)

0011是一个数字文字;数字110110011等相同,并且不保留任何前导零,因为它们没有语义值(作为数字)。它不是一个字符串;字符串文字围绕单引号(即'0011')并保留所有字符。

如果你想保留前导零,那么使用字符串:

SELECT '12345' || '0011' FROM DUAL

或将数字转换为零填充字符串:

SELECT LPAD( 12345, 5, '0' ) || LPAD( 11, 4, '0' ) FROM DUAL;

(注意:如果输入长于填充大小,则LPAD将显示最高位数,直到达到填充大小为止

或者

SELECT TO_CHAR( 12345, '00000' ) || TO_CHAR( 11, '0000' ) FROM DUAL;

(注意:如果输入的长度超过格式掩码的大小,那么TO_CHAR将不会显示数字,而是会显示#个字符

答案 1 :(得分:1)

如果你总是想要4位数,那么Oracle有to_char()

select trim(to_char(12345,'99999999999') -- use as many 9's as the max length of field1
     || to_char(0011,'0000') -- This will always pad this to 4 digits
from dual