Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Максимальное число в текстовом поле  [new]
Volt(220)
Guest
Есть столбец varchar(20) c данными:
2000321
20000321
12358asd
0013846

Нужно получить следующее число (т.е. 20000322).

Вопрос: Как?

Идеи:
Запрос:
select max(stol)+1 from tab
нужного результата, конечно же, не дает.

Запрос:
select cast(stol as int)+1 from tab
рушится на значении 12358asd.
15 дек 09, 12:17    [8068187]     Ответить | Цитировать Сообщить модератору
 Re: Максимальное число в текстовом поле  [new]
Volt(220)
Guest
Решением было бы создать функцию вида:
CREATE FUNCTION ьнCast( @str varchar(20))

RETURNS int
AS
BEGIN

	DECLARE @rez int

BEGIN TRY     
		SELECT @rez=cast(@str as int)
END TRY
BEGIN CATCH 
    select @rez=null
END CATCH;
	
	RETURN @rez

END

Но нельзя использовать try...catch
15 дек 09, 12:20    [8068219]     Ответить | Цитировать Сообщить модератору
 Re: Максимальное число в текстовом поле  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36824
Сначала создаем себе геморрой, храня числа в нечисловом типе данных, а потом героически начинаем его преодолевать?
15 дек 09, 12:20    [8068220]     Ответить | Цитировать Сообщить модератору
 Re: Максимальное число в текстовом поле  [new]
-=DiM@n=-
Member

Откуда: Москва
Сообщений: 1564
select isnull(max(stol), 0)+1 
from tab
where isnumeric(stol) = 1
15 дек 09, 12:21    [8068224]     Ответить | Цитировать Сообщить модератору
 Re: Максимальное число в текстовом поле  [new]
Volt(220)
Guest
Гавриленко Сергей Алексеевич
База не моя. Мне надо прикрутить функцию.
-=DiM@n=-
Спасибо. where isnumeric(stol) = 1 - то чего мне не хватало.
Только в итоге это должно выглядеть так:
select isnull(max (cast(stol as int)), 0)+1 
from tab
where isnumeric(stol) = 1
иначе max(stol) вернет: 2000321 вместо 20000321.
15 дек 09, 13:14    [8068654]     Ответить | Цитировать Сообщить модератору
 Re: Максимальное число в текстовом поле  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Volt(220)
Гавриленко Сергей Алексеевич
База не моя. Мне надо прикрутить функцию.
-=DiM@n=-
Спасибо. where isnumeric(stol) = 1 - то чего мне не хватало.
Только в итоге это должно выглядеть так:
select isnull(max (cast(stol as int)), 0)+1 
from tab
where isnumeric(stol) = 1
иначе max(stol) вернет: 2000321 вместо 20000321.
"Мопед не мой, я просто разместил объяву"

Вы уверены, что если ISNUMERIC(stol)=1, то stol можно преобразовать в целое?
Боюсь Вас огорчить, но (увы!) это не так!
Кроме того, проверка в WHERE не гарантирует, что сервер не попытается сначала посчитать выражения в SELECTе.
Для начала определитесь, какого типа числа Вам нужны из поля stol.
15 дек 09, 13:22    [8068717]     Ответить | Цитировать Сообщить модератору
 Re: Максимальное число в текстовом поле  [new]
Volt(220)
Guest
iap
Вы уверены, что если ISNUMERIC(stol)=1, то stol можно преобразовать в целое?
Боюсь Вас огорчить, но (увы!) это не так!


Мда... Рушится на дробных числах.
Добавление round помогает.
Но приведение числа 20000322.4 к 20000322 нежелательно. Желательно отсекать все, что не целое.

iap
Кроме того, проверка в WHERE не гарантирует, что сервер не попытается сначала посчитать выражения в SELECTе.


Предлагаете поэкспериментировать с планом выполнения? :)

iap
Для начала определитесь, какого типа числа Вам нужны из поля stol.

Целые числа.
15 дек 09, 14:36    [8069329]     Ответить | Цитировать Сообщить модератору
 Re: Максимальное число в текстовом поле  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Volt(220)
iap
Вы уверены, что если ISNUMERIC(stol)=1, то stol можно преобразовать в целое?
Боюсь Вас огорчить, но (увы!) это не так!


Мда... Рушится на дробных числах.
Добавление round помогает.
Но приведение числа 20000322.4 к 20000322 нежелательно. Желательно отсекать все, что не целое.

iap
Кроме того, проверка в WHERE не гарантирует, что сервер не попытается сначала посчитать выражения в SELECTе.


Предлагаете поэкспериментировать с планом выполнения? :)

iap
Для начала определитесь, какого типа числа Вам нужны из поля stol.

Целые числа.
SELECT 1+MAX(CAST(CASE WHEN ISNUMERIC(stol)=1 AND stol NOT LIKE '%[^ 0-9+-]%' THEN stol END AS DEC(20)))
FROM tab
WHERE ISNUMERIC(stol)=1 AND stol NOT LIKE '%[^ 0-9+-]%';
На всякий случай преобразую к DEC(20) (потому что поле varchar(20)), но в принципе можно и к BIGINT, и к INT
15 дек 09, 14:54    [8069503]     Ответить | Цитировать Сообщить модератору
 Re: Максимальное число в текстовом поле  [new]
Volt(220)
Guest
iap
Спасибо.
Только возникло 2 вопроса:
1. Зачем нужен isnumeric? Для ускорения обработки?
2. Зачем нужен where?
15 дек 09, 15:15    [8069656]     Ответить | Цитировать Сообщить модератору
 Re: Максимальное число в текстовом поле  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Volt(220)
iap
Спасибо.
Только возникло 2 вопроса:
1. Зачем нужен isnumeric? Для ускорения обработки?
2. Зачем нужен where?
1. Чтобы все символы стояли на допустимых местах в допустимом количестве.
Например, если все цифры будут перемежаться пробелами, то конвертировать в целое не получится
(пробел может быть только в начале и в конце).
2. Вот это лучше посмотреть в плане. Может быть, WHERE так сократит количество строк для обработки, что только лучше станет.
А может и нет...

Да, и я ISNULL как-то упустил... На случай, если строк ещё нет, он пригодился бы.
15 дек 09, 15:20    [8069702]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить