Я работаю в базе данных 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, который я когда-либо видел. Но поскольку я сейчас как-то застрял в нем, у кого-нибудь есть более удобный и более короткий подход, чтобы сделать то же самое?
ahh, "to easy solution" -Way of beeing stuck ... thx – nurgan