2014-02-19 3 views
0

Я работаю в базе данных Oracle 10g. В таблице есть столбец CODE, который является основным ключом, и является varchar. Поле всегда находится в формате «xx xxx xx», например «20 965 04», причем первое и второе номера не имеют значения, а последняя часть - порядковый номер.Конкатенация строк в запросе, заполнение строки до фиксированной длины

Что мне нужно сделать, это сделать INSERT, когда первые две части ключа остаются теми же, а последняя часть - более, чем самый высокий последовательный номер для этих конкретных первых частей.

Итак, я играя запущен при Литтл, и мой первый подход был, как:

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 "!

Таким образом, единственный способ, которым я мог думать это саз проверки длины строки после увеличения числа и добавления 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, который я когда-либо видел. Но поскольку я сейчас как-то застрял в нем, у кого-нибудь есть более удобный и более короткий подход, чтобы сделать то же самое?

ответ

0

Функция TO_CHAR имеет формат параметра Я, вы можете использовать:

SUBSTR('20 031 03', 1, 7) || 
TO_CHAR(
    TO_NUMBER( 
    SUBSTR(
    (SELECT MAX(CODE) FROM table tmk WHERE tmk.CODE LIKE SUBSTR('20 031 03', 1, 6) || '%') 
    , 8, 2) + 1 
) 
, 'FM00') 

Я изменил свои параметры SubStr slighly. Индексы начинаются с 1. И вы хотите получить последнее число из двух цифр.

+0

ahh, "to easy solution" -Way of beeing stuck ... thx – nurgan

1

Посмотрите на функцию LPAD.

Например, SELECT LPAD(1,2,'0') FROM DUAL вернет 01.

Смежные вопросы