Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 получение следующего значения  [new]
Honey
Member

Откуда: Минск
Сообщений: 195
Поле в таблице является строковым и может содержать непоследовательные значения:
str5
str6
str7
str1
str2

Как получить одним запросом следующее значение (max +1), в данном примере str8 ?
Как получить одним запросом пропущенное значение в последовательности, в данном примере str3 ?
13 ноя 09, 16:36    [7927331]     Ответить | Цитировать Сообщить модератору
 Re: получение следующего значения  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
Ну сначала распарсить строку, затем найти (max +1), а затем снова склеить.
13 ноя 09, 16:52    [7927485]     Ответить | Цитировать Сообщить модератору
 Re: получение следующего значения  [new]
Honey
Member

Откуда: Минск
Сообщений: 195
Сама себе отвечу, вот следующее значение:

SELECT MAX(CAST(RIGHT(name, LEN(name)-3) AS INT)) + 1
FROM table
13 ноя 09, 17:38    [7927874]     Ответить | Цитировать Сообщить модератору
 Re: получение следующего значения  [new]
MustDie
Member

Откуда: Подмосковье
Сообщений: 229
Honey
Поле в таблице является строковым и может содержать непоследовательные значения:
str5
str6
str7
str1
str2

Как получить одним запросом следующее значение (max +1), в данном примере str8 ?
Как получить одним запросом пропущенное значение в последовательности, в данном примере str3 ?



   DECLARE @max INT, @min INT
   SET @min=1; -- начало
   SET @max=1000000; -- конец
   -- рекурсия поиска "дырок"
   WITH CTE(X) AS (SELECT @min UNION ALL SELECT X+1 FROM CTE WHERE X<@max) 
   SELECT FreeNumbers = N'str'+CAST(X as NVARCHAR(15))  FROM CTE WHERE X NOT IN
    (SELECT CAST(RIGHT(name, LEN(name)-3) AS INT) FROM [table])  -- выборка уже использованных чисел 
   OPTION(MAXRECURSION 0) 
сразу скажу, что работает медленно - чем больше максимум, тем медленнее!
можно максимум взять существующий, как Вы уже сделали...
13 ноя 09, 18:08    [7928032]     Ответить | Цитировать Сообщить модератору
 Re: получение следующего значения  [new]
iljy
Member

Откуда:
Сообщений: 8711
Honey
Поле в таблице является строковым и может содержать непоследовательные значения:
str5
str6
str7
str1
str2

Как получить одним запросом следующее значение (max +1), в данном примере str8 ?
Как получить одним запросом пропущенное значение в последовательности, в данном примереstr3 ?


select top 1 'str' + CAST(NRow as varchar(10)) from
(
	select s, cast(substring(s,4,8000) as int) N, row_number() over(order by cast(substring(s,4,8000) as int)) NRow
	from
	(
	select 'str5' s union all
	select 'str6' s union all
	select 'str7' s union all
	select 'str1' s union all
	select 'str2' s
	) t
) t
where N != NRow
order by NRow
13 ноя 09, 19:07    [7928202]     Ответить | Цитировать Сообщить модератору
 Re: получение следующего значения  [new]
Honey
Member

Откуда: Минск
Сообщений: 195
Отлично, спасибо ;-)
16 ноя 09, 12:45    [7933207]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить