我正在使用Oracle 10g数据库。 该表具有一列CODE,它是主键,并且是一个varchar。 该字段始终格式为“xx xxx xx”,例如“20 965 04”,第一个和第二个数字不相关,最后一个数字为连续数字。查询中的字符串连接,将字符串填充到固定长度
我要做的是,做一个INSERT,其中的关键字的前两个部分保持不变,最后一个部分比这些具体的第一个部分的最高连续数字多一个。
所以,我startet打了一下,我的第一个方法是这样的:
SUBSTR('20 031 03', 0, 7)||(TO_CHAR(TO_NUMBER(
SUBSTR(
(SELECT MAX(CODE)
FROM table tmk
WHERE tmk.CODE LIKE SUBSTR('20 031 03', 0, 6)||'%')
, 8, 9)) + 1
))
这种做法已经是不漂亮,但在我看来确定。 但是后来我意识到,当连续数字低于10时,在TO_NUMBER和TO_CHAR之后,它的例子是5而不是05. 因此,如果我有“20 965 04”,那么在此之后我得到的是“ 20 965 5“但我需要”20 965 05“!
所以,我能想到的唯一的办法就是一个case语句检查字符串的长度增加数量,并添加0,如果neccecary后:
SELECT
CASE (LENGTH(TO_CHAR(TO_NUMBER(SUBSTR(
(SELECT MAX(CODE)
FROM table tmk
WHERE tmk.CODE LIKE SUBSTR('20 031 03', 0, 6)||'%')
, 8, 9)) + 1
)))
WHEN 1 THEN
SUBSTR('20 031 03', 0, 7)||'0'||(TO_CHAR(TO_NUMBER(
SUBSTR(
(SELECT MAX(CODE)
FROM table tmk
WHERE tmk.CODE LIKE SUBSTR('20 031 03', 0, 6)||'%')
, 8, 9)) + 1
))
ELSE
SUBSTR('20 031 03', 0, 7)||(TO_CHAR(TO_NUMBER(
SUBSTR(
(SELECT MAX(CODE)
FROM table tmk
WHERE tmk.CODE LIKE SUBSTR('20 031 03', 0, 6)||'%')
, 8, 9)) + 1
))
END
FROM dual;
所以这个工作,但东西就像我见过的最丑陋的SQL一样。但是,由于我目前以某种方式卡住了它,有没有人有更好更短的方法来做同样的事情?
ahh,“解决方案” - beeing卡住了... thx – nurgan