Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как проверить число  [new]
4cbn3c4534
Guest
Содержащееся в varchar на конвертабельность к bigint ?
1 фев 13, 12:31    [13861210]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить число  [new]
DmitryZ78
Member

Откуда: Каменск-Уральский
Сообщений: 84
4cbn3c4534,

try / catch
1 фев 13, 12:41    [13861271]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить число  [new]
Edkonst2008
Member

Откуда:
Сообщений: 503
DmitryZ78
4cbn3c4534,

try / catch


и cast :-)
1 фев 13, 12:42    [13861278]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить число  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
может велосипед
declare @str varchar(max)
set @str = '+23123466666666666555'
select CHARINDEX('+',@str) 
select CAST(@str as bigint) 
where @str not like('%[^0-9,-,+]%')
and not  CHARINDEX(@str,'-')>1
and not  CHARINDEX(@str,'+')>1
and len(replace(replace(@str,'-',''),'+',''))<=19
1 фев 13, 12:47    [13861327]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить число  [new]
4cbn3c4534
Guest
DmitryZ78
try / catch
Незя.

Мистер Хенки
может велосипед
declare @str varchar(max)
set @str = '+23123466666666666555'
select CHARINDEX('+',@str) 
select CAST(@str as bigint) 
where @str not like('%[^0-9,-,+]%')
and not  CHARINDEX(@str,'-')>1
and not  CHARINDEX(@str,'+')>1
and len(replace(replace(@str,'-',''),'+',''))<=19
Похоже, но там 19ый разряд не полный по идее.
1 фев 13, 12:52    [13861363]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить число  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
4cbn3c4534
Похоже, но там 19ый разряд не полный по идее.

Ну может тогда (replace(replace(@str,'-',''),'+','')) <'9223372036854775808'
1 фев 13, 13:04    [13861467]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить число  [new]
4cbn3c4534
Guest
А что скажете про такой изврат? Исключения могут быть?

IF (ISNUMERIC(@number) = 1)
	IF (CAST(@number as float) > 0 and CAST(@number as float) < 9223372036854775807)
		SELECT CAST(CAST(@number as float) as bigint)
1 фев 13, 13:09    [13861496]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить число  [new]
Гость333
Member

Откуда:
Сообщений: 3683
4cbn3c4534
А что скажете про такой изврат? Исключения могут быть?

IF (ISNUMERIC(@number) = 1)
	IF (CAST(@number as float) > 0 and CAST(@number as float) < 9223372036854775807)
		SELECT CAST(CAST(@number as float) as bigint)

Да сколько угодно :)
DECLARE @number VARCHAR(10) = '3.14e+1';
IF (ISNUMERIC(@number) = 1)
	IF (CAST(@number as float) > 0 and CAST(@number as float) < 9223372036854775807)
		SELECT CAST(CAST(@number as float) as bigint)
1 фев 13, 13:11    [13861506]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить число  [new]
4cbn3c4534
Guest
Гость333
Да сколько угодно :)
DECLARE @number VARCHAR(10) = '3.14e+1';
Ну и будет 31, что вполне соответствует.
1 фев 13, 13:15    [13861525]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить число  [new]
Гость333
Member

Откуда:
Сообщений: 3683
4cbn3c4534
Ну и будет 31, что вполне соответствует.

Ну ладно, если вас такой вариант устраивает, тогда так :)
DECLARE @number VARCHAR(10) = '$10'
IF (ISNUMERIC(@number) = 1)
	IF (CAST(@number as float) > 0 and CAST(@number as float) < 9223372036854775807)
		SELECT CAST(CAST(@number as float) as bigint)
1 фев 13, 13:18    [13861543]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить число  [new]
4cbn3c4534
Guest
Гость333
DECLARE @number VARCHAR(10) = '$10'
Издеватели блин, напридумывали всякой ерунды, вот ломай тут голову.
Ну и чего делать?
1 фев 13, 13:30    [13861635]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить число  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
4cbn3c4534
Гость333
DECLARE @number VARCHAR(10) = '$10'
Издеватели блин, напридумывали всякой ерунды, вот ломай тут голову.
Ну и чего делать?

так а мой вариант с (replace(replace(@str,'-',''),'+','')) <'9223372036854775808' ?
1 фев 13, 13:33    [13861662]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить число  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
сделай функцию с try catch. Самое суровое имхо
1 фев 13, 13:35    [13861686]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить число  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
SELECT ID
,CAST
 (
  CASE
   WHEN ISNUMERIC(Field)=1
    AND Field NOT LIKE '%[^0-9 +-]%'
    AND LEN(REPLACE(REPLACE(REPLACE(Field,' ',''),'-',''),'+',''))<=19
   THEN CASE WHEN CAST(Field AS DEC(38,0)) BETWEEN -9223372036854775808 AND 9223372036854775807 THEN Field END
  END AS BIGINT
 ) [BigIntValue]
FROM T
WHERE
  CASE
   WHEN ISNUMERIC(Field)=1
    AND Field NOT LIKE '%[^0-9 +-]%'
    AND LEN(REPLACE(REPLACE(REPLACE(Field,' ',''),'-',''),'+',''))<=19
   THEN CASE WHEN CAST(Field AS DEC(38,0)) BETWEEN -9223372036854775808 AND 9223372036854775807 THEN Field END
  END IS NOT NULL;
1 фев 13, 13:39    [13861719]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить число  [new]
4cbn3c4534
Guest
Мистер Хенки
так а мой вариант с (replace(replace(@str,'-',''),'+','')) <'9223372036854775808' ?
Меня смущает это сравнение строк, во что он их конвертит при сравнении? В decimal максимальной длинны.
Вроде работоспособно, наверное примерно так и сделаю.
Мистер Хенки
сделай функцию с try catch. Самое суровое имхо
В обычной функции нельзя использовать try catch.
1 фев 13, 13:49    [13861809]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить число  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
4cbn3c4534
Мистер Хенки
так а мой вариант с (replace(replace(@str,'-',''),'+','')) <'9223372036854775808' ?
Меня смущает это сравнение строк
Правильно смущает
SELECT CASE WHEN '93'>'9223372036854775808' THEN '>' ELSE '<=' END;
1 фев 13, 13:55    [13861853]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить число  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
4cbn3c4534
Мистер Хенки
так а мой вариант с (replace(replace(@str,'-',''),'+','')) <'9223372036854775808' ?
Меня смущает это сравнение строк, во что он их конвертит при сравнении? В decimal максимальной длинны.
Вроде работоспособно, наверное примерно так и сделаю.
Мистер Хенки
сделай функцию с try catch. Самое суровое имхо
В обычной функции нельзя использовать try catch.

да тогда вот 13861719 самый правильный способ.
1 фев 13, 13:56    [13861860]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить число  [new]
4cbn3c4534
Guest
Мистер Хенки
самый правильный способ.

Ну там фактически вот что:

IF (ISNUMERIC(@number) = 1)
	IF (@number not like ('%[^0-9,+]%'))
		IF (CAST(@number as decimal(38)) between 0 and 9223372036854775807)
			SELECT CAST(@number as bigint)
1 фев 13, 14:12    [13861979]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить число  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
4cbn3c4534
Мистер Хенки
самый правильный способ.

Ну там фактически вот что:

IF (ISNUMERIC(@number) = 1)
	IF (@number not like ('%[^0-9,+]%'))
		IF (CAST(@number as decimal(38)) between 0 and 9223372036854775807)
			SELECT CAST(@number as bigint)
А отрицательные числа небогоугодны что ли?
1 фев 13, 14:19    [13862030]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить число  [new]
4cbn3c4534
Guest
iap
А отрицательные числа небогоугодны что ли?
Ну для моей задачи нафиг не нужны, смело можно отбросить.

Если писать универсальную функцию VarcharToBigint, то там все сложнее, из-за денег и плавающих.
1 фев 13, 14:26    [13862076]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить число  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
4cbn3c4534,

Версия сиквела не указана поэтому вот еще вариант для 2012

http://www.dotnetfunda.com/articles/article1981-let39s-learn-tryparse-function-of-sql-server-2012-denali.aspx
3 фев 13, 00:19    [13867247]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить