Оператор Select с уникальным форматом в SQL Server

avatar
Vahid
8 апреля 2018 в 05:19
38
2
-1

У меня есть таблица со столбцом "Число", который содержит такие значения, как INV-00100,INV-00101,INV-00102,INV-00103 и т.д.

Я хочу получить максимальное значение +1 в формате вроде "INV-00103". Как это возможно? Какие-либо предложения??

Я попробовал этот запрос

SELECT 
    ISNULL(MAX(CAST(SUBSTRING(Number, 5, LEN(Number) - 4) AS INT)), 0) AS [MaxNo] 
FROM 
    Table

Но этот оператор возвращает в качестве результата "103". Я хочу получить это «103» как «00103» (всего 5 цифр).

Источник
RnP
8 апреля 2018 в 05:22
0

Не могли бы вы уточнить свой вопрос? В нынешнем виде это звучит довольно тривиально. что ты уже испробовал?

Vahid
8 апреля 2018 в 05:28
0

Отредактировал мой вопрос

Ответы (2)

avatar
PSK
8 апреля 2018 в 05:37
2

Попробуйте следующее.

 DECLARE @TABLE TABLE(Code VARCHAR(100))
 INSERT INTO @TABLE
 VALUES ('INV-00100'),('INV-00101'),('INV-00102') 

 SELECT RIGHT('00000'+ 
  CAST(MAX(TRY_PARSE(SUBSTRING(Code,CHARINDEX('-',Code)+1,
  LEN(Code)-CHARINDEX('-',Code)) AS INT) + 1) AS VARCHAR(10)),5)
 FROM @TABLE

Вывод

00103

Изменить:

Это работает нормально.. Но что произойдет, если число превысит 99999?? Даст ли это значение, подобное INV-100000 – Вахид

 DECLARE @TABLE TABLE(Code VARCHAR(100))
 INSERT INTO @TABLE
 VALUES ('INV-00100'),('INV-00101'),('INV-00102') 

 SELECT 
 (
 CASE WHEN  [Output] > 99999 THEN CAST([Output] AS VARCHAR(100))
  --MORE CONDITION
  ELSE RIGHT('00000'+CAST([Output] AS VARCHAR(100)),5)
  END
 ) AS [Output]

  FROM
 (
 SELECT 
  MAX(TRY_PARSE(SUBSTRING(Code,CHARINDEX('-',Code)+1,
  LEN(Code)-CHARINDEX('-',Code)) AS INT) + 1) AS [Output]
 FROM @TABLE
 ) T
Vahid
8 апреля 2018 в 06:27
0

Это работает нормально. Но что произойдет, если число превысит 99999 ?? Даст ли это значение, подобное INV-100000?

PSK
8 апреля 2018 в 06:34
0

вы можете указать условие регистра, например значение> 100000, а затем выбрать определенный формат.

avatar
Phil Baines
8 апреля 2018 в 05:36
0

А как насчет этого?

select left('INV-00100',6) + cast(max(cast(right('INV-00100', 5) as int) + 1)as VARCHAR)