2016-03-18 2 views
0

Мне нужно извлечь следующий номер из заданных чисел. Моя таблица содержит номера, как показано ниже. Основной продукт всегда с .1 в конце и может или не содержит его субпродукты, например:Извлечь последний номер из существующего

07.0001.1 (main product) 
07.0001.2 (his sub) 
07.0001.3 (his sub) 
etc.. 

01.1453.1 
01.1453.2 
03.3456.1 
03.3456.2 
03.3456.3 
03.5436.1 
03.5436.2 
03.5436.3 
03.5436.4 
12.7839.1 
12.7839.2 
12.3232.1 
12.4444.1 
12.4444.2 
13.7676.1 

я хочу передать первые цифры числа в запрос и на основе этого получить все, что начинается с этим а затем получить наибольшее количество из следующих четырех и вернуть этот номер + 1.

так что, если мы возьмем выше пример входных сигналов, если я говорю 12, то он должен найти этот продукт: 12.7839.x и вернуть 12.7839 + 1 так 12.7840

Другой пример, если я скажу 03 то следует найти 03.5436 так 03.5436 + 1 поэтому должен вернуться 03.5437

Надеюсь, вы знаете, что я имею в виду.

Я не так хорошо знакомы с SQL, но это, как далеко я нахожусь:

select * from tbArtikel where Nummer LIKE '12.%' 
+1

Кажется, что вы перепутали три значения в одну колонку с разделителями точек. Ваш запрос и ваша жизнь были бы намного проще, если бы у вас было всего три столбца. Если вам отчаянно требуется это составное значение в качестве столбца, создайте представление, которое выводит выражение с разделителями с точками как дополнительный столбец. – Bohemian

+0

Правильно, у вас на самом деле есть два вопроса: 1) как искать по частному номеру 2) как автоинкремент? –

ответ

0

Попробуйте это, извлечь первые две части, преобразовать 2-ое в числовое значение, добавьте и преобразовать обратно к строка снова:

select 
    parsename(max(nummer), 3) + '.'     -- 03 
    + ltrim(max(cast(parsename(nummer, 2) as int) +1)) -- 5436 -> 5437 
    + '.1'           
from tbArtikel 
where Nummer LIKE '03.%' 
+0

Я понимаю, что если сеть будет пропущена, это вернет NULL правильно? Я сделал несколько тестов и, кажется, работаю. Я планирую развернуть на производстве, вы уверены, что он всегда будет работать, как я представил? :) –

+1

@JohnDoe: "* net прошло число *" = "no прошедшее число"? Если нет соответствующего номера, строка не будет возвращена. «* развертывание на производстве *» в течение получаса? Agile ... – dnoeth

+0

i: если первые две цифры не будут существовать в db даже один раз, значит, ни один продукт, начинающийся с переданного значения, не вернет null правильно? –

0

Попробуйте, как это,

DECLARE @table TABLE (col VARCHAR(10)) 

INSERT INTO @table 
VALUES ('01.1453.1') 
    ,('01.1453.2') 
    ,('03.3456.1') 
    ,('03.3456.2') 
    ,('03.3456.3') 
    ,('03.5436.1') 
    ,('03.5436.2') 
    ,('03.5436.3') 
    ,('03.5436.4') 
    ,('12.7839.1') 
    ,('12.7839.2') 
    ,('12.3232.1') 
    ,('12.4444.1') 
    ,('12.4444.2') 
    ,('13.7676.1') 

SELECT TOP 1 left(col, charindex('.', col, 1) - 1) + '.' + convert(VARCHAR(10), convert(INT, substring(col, charindex('.', col, 1) + 1, charindex('.', col, charindex('.', col, 1) + 1) - (charindex('.', col, 1) + 1))) + 1) 
FROM @table 
WHERE col LIKE '03.%' 
ORDER BY 1 DESC 
2

Это еще один альтернативный для достижения желаемого Результаты. Предоставление опции для передачи числа, которое нужно запросить. Рассмотрите следующие предложения SQL:

CREATE TABLE tblDummyExample 
(
    Number  VARCHAR(64) 
) 


INSERT INTO tblDummyExample 
VALUES ('07.0001.1') 
, ('07.0001.2') 
, ('07.0001.3') 
, ('01.1453.1') 
, ('01.1453.2') 
, ('03.3456.1') 
, ('03.3456.2') 
, ('03.3456.3') 
, ('03.5436.1') 
, ('03.5436.2') 
, ('03.5436.3') 
, ('03.5436.4') 
, ('12.7839.1') 
, ('12.7839.2') 
, ('12.3232.1') 
, ('12.4444.1') 
, ('12.4444.2') 
, ('13.7676.1') 


DECLARE @startWith VARCHAR(2) = '12'  -- provide any number as input 

SELECT @startWith + '.'+ CAST((MAX(CAST(SUBSTRING(ex.Number, (CHARINDEX('.', ex.Number, 1) + 1), (CHARINDEX('.', ex.Number, (CHARINDEX('.', ex.Number, 1) + 1)) - (CHARINDEX('.', ex.Number, 1) + 1))) AS INT)) + 1) AS VARCHAR(16)) 
FROM tblDummyExample ex 
WHERE ex.Number LIKE @startWith+'%' 

Я уверен, что это решение не ограничивается какой-либо конкретной версией SQL Server.

+0

Ну, 'PARSENAME' существует с SS2005 :) – dnoeth

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