从现有号码中提取最后一个号码

时间:2016-03-18 07:02:03

标签: sql sql-server

我必须从给定的数字中提取下一个数字。我的表包含如下数字。主要产品最后总是带有.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.%'

3 个答案:

答案 0 :(得分: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版本。

答案 1 :(得分:0)

试试这个,提取前两个部分,将第二个转换为数值,添加一个并再次转换回字符串:

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

答案 2 :(得分: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