Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Адекватная замена ISNUMERIC (2008)  [new]
_Промешан_
Member

Откуда:
Сообщений: 970
Есть какая-то адекватная замена, кроме:

declare @a varchar (100)='00,15'  --'.15'    '15'   '15.'  '00.15' 
select case when @a like '%[^1234567890.]%' or @a like '.%' or @a like '%.'   then 0 else 1 end

?

Если нет такой адекватной замены, текущая - насколько медленнее/быстрее ISNUMERIC ?
22 фев 13, 18:50    [13968685]     Ответить | Цитировать Сообщить модератору
 Re: Адекватная замена ISNUMERIC (2008)  [new]
_Промешан_
Member

Откуда:
Сообщений: 970
И в случае с отсуствием адекватной функции, разумно ли запихивать вышеприведенный код в UDF, учитывая угрожающе-грозную статью: http://habrahabr.ru/post/170187/
22 фев 13, 18:52    [13968698]     Ответить | Цитировать Сообщить модератору
 Re: Адекватная замена ISNUMERIC (2008)  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
_Промешан_,

Всё как усегда зависит от задачи.
Udf зло.
22 фев 13, 19:00    [13968739]     Ответить | Цитировать Сообщить модератору
 Re: Адекватная замена ISNUMERIC (2008)  [new]
_Промешан_
Member

Откуда:
Сообщений: 970
Блин. Недописал.

declare @a varchar (100)='00..15'
if (select case when @a like '%[^1234567890.]%' or @a like '.%' or @a like '%.' or @a like '%..' or @a like '..%' or @a like '%..%'  then 0 else 1  end) = 1
  select cast(@a as float)
else
  select 'NaN'


Более правильно. Вроде?
22 фев 13, 19:07    [13968776]     Ответить | Цитировать Сообщить модератору
 Re: Адекватная замена ISNUMERIC (2008)  [new]
_Промешан_
Member

Откуда:
Сообщений: 970
Блин перемудрил.

declare @a varchar (100)='00..15'
if (select case when @a like '%[^1234567890.]%' or @a like '.%' or @a like '%.'  or @a like '%..%'  then 0 else 1  end) = 1
  select cast(@a as float)
else
  select 'NaN'
22 фев 13, 19:08    [13968781]     Ответить | Цитировать Сообщить модератору
 Re: Адекватная замена ISNUMERIC (2008)  [new]
_Промешан_
Member

Откуда:
Сообщений: 970
WarAnt
_Промешан_,

Всё как усегда зависит от задачи.
Udf зло.


Мда...
Планировщик показывает для выборки из 10000 записей, что isnumeric быстрее, на фильтрацию 7%. А на вариант с case - 37%.
ну и разумеется количество записей в первом случае больше итоговых, т.к. не все нумерики в результате isnumeric.
22 фев 13, 19:15    [13968800]     Ответить | Цитировать Сообщить модератору
 Re: Адекватная замена ISNUMERIC (2008)  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
_Промешан_,

если задача не разовая, делайте clr ,удет шанс на приблизится к результату isnumeric
22 фев 13, 19:19    [13968812]     Ответить | Цитировать Сообщить модератору
 Re: Адекватная замена ISNUMERIC (2008)  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
_Промешан_,

чего там мудрить-то

ошибка при конвертации
Допустимость преобразования
Как проверить число

и тд. и т.п...
22 фев 13, 19:31    [13968844]     Ответить | Цитировать Сообщить модератору
 Re: Адекватная замена ISNUMERIC (2008)  [new]
_Промешан_
Member

Откуда:
Сообщений: 970
iap
_Промешан_,

чего там мудрить-то

ошибка при конвертации
Допустимость преобразования
Как проверить число

и тд. и т.п...
Спасибо поржал
22 фев 13, 20:03    [13968923]     Ответить | Цитировать Сообщить модератору
 Re: Адекватная замена ISNUMERIC (2008)  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
_Промешан_
iap
_Промешан_,

чего там мудрить-то

ошибка при конвертации
Допустимость преобразования
Как проверить число

и тд. и т.п...
Спасибо поржал
Над чем?
22 фев 13, 21:37    [13969123]     Ответить | Цитировать Сообщить модератору
 Re: Адекватная замена ISNUMERIC (2008)  [new]
_Промешан_
Member

Откуда:
Сообщений: 970
iap
_Промешан_
пропущено...
Спасибо поржал
Над чем?

Над тем, что решения более гиморные, в смысле кода. А затраты ресурсов те же (или чего то не уловил).
23 фев 13, 14:51    [13970532]     Ответить | Цитировать Сообщить модератору
 Re: Адекватная замена ISNUMERIC (2008)  [new]
_Промешан_
Member

Откуда:
Сообщений: 970
WarAnt
_Промешан_,

если задача не разовая, делайте clr ,удет шанс на приблизится к результату isnumeric

На сях?
clr что то я ниразу не прикручивал к серверу. хотя интересно!
23 фев 13, 14:51    [13970534]     Ответить | Цитировать Сообщить модератору
 Re: Адекватная замена ISNUMERIC (2008)  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
_Промешан_
iap
пропущено...
Над чем?

Над тем, что решения более гиморные, в смысле кода. А затраты ресурсов те же (или чего то не уловил).
Смех без причины, значит?
23 фев 13, 16:41    [13970758]     Ответить | Цитировать Сообщить модератору
 Re: Адекватная замена ISNUMERIC (2008)  [new]
_Промешан_
Member

Откуда:
Сообщений: 970
iap
_Промешан_
пропущено...

Над тем, что решения более гиморные, в смысле кода. А затраты ресурсов те же (или чего то не уловил).
Смех без причины, значит?
Кому как говорится...
25 фев 13, 00:59    [13974090]     Ответить | Цитировать Сообщить модератору
 Re: Адекватная замена ISNUMERIC (2008)  [new]
_Промешан_
Member

Откуда:
Сообщений: 970
Но гимор там редкостный в плане количества кода.
25 фев 13, 01:01    [13974093]     Ответить | Цитировать Сообщить модератору
 Re: Адекватная замена ISNUMERIC (2008)  [new]
MiCe
Member

Откуда: RUSSIA STAVROPOL Pyatigorsk
Сообщений: 1996
для каких целей нужно?
откуда берутся эти данные?
существует несколько вариантов реализации ...
сформулируйте задачу....
нужно разово или переодически или реалтайм?
25 фев 13, 01:49    [13974136]     Ответить | Цитировать Сообщить модератору
 Re: Адекватная замена ISNUMERIC (2008)  [new]
Гость333
Member

Откуда:
Сообщений: 3683
_Промешан_
Блин перемудрил.

declare @a varchar (100)='00..15'
if (select case when @a like '%[^1234567890.]%' or @a like '.%' or @a like '%.'  or @a like '%..%'  then 0 else 1  end) = 1
  select cast(@a as float)
else
  select 'NaN'

Ответ неверный. Во-первых, вот этим "or @a like '.%' or @a like '%.'" отсеиваются валидные значения:
select cast('.15' as float), cast('15.' as float)

Во-вторых, вот это "@a like '%..%'" пропускает невалидные значения:
declare @a varchar (100)='15.15.15.15'
if (select case when @a like '%[^1234567890.]%' or @a like '.%' or @a like '%.'  or @a like '%..%'  then 0 else 1  end) = 1
  select cast(@a as float)
else
  select 'NaN'

Msg 8114, Level 16, State 5, Line 3
Error converting data type varchar to float.

В-третьих, отсеиваются строки, у которых есть пробелы в начале или конце.

Ну и критерий валидности вы не озвучили. Отрицательные числа не нужны? Числа с плавающей точкой (например, 1.2345e-12) не нужны?
25 фев 13, 10:18    [13974883]     Ответить | Цитировать Сообщить модератору
 Re: Адекватная замена ISNUMERIC (2008)  [new]
MiCe
Member

Откуда: RUSSIA STAVROPOL Pyatigorsk
Сообщений: 1996
млин... лююююди... ответте - зачем это в базе....???????
25 фев 13, 10:31    [13974951]     Ответить | Цитировать Сообщить модератору
 Re: Адекватная замена ISNUMERIC (2008)  [new]
_Промешан_
Member

Откуда:
Сообщений: 970
MiCe
для каких целей нужно?
откуда берутся эти данные?
существует несколько вариантов реализации ...
сформулируйте задачу....
нужно разово или переодически или реалтайм?

Когда я знаю, что нужно получить флоат, мне нужно проверить и сказать юзеру - "это флоат" или "это не флоат - пилите дальше".

select cast('.15' as float), cast('15.' as float)
Гость333, в нашей базе это не считается валидными значениями.


автор
declare @a varchar (100)='15.15.15.15'
if (select case when @a like '%[^1234567890.]%' or @a like '.%' or @a like '%.' or @a like '%..%' then 0 else 1 end) = 1
select cast(@a as float)
else
select 'NaN'
Точно! Ну здесь добавим в последние кавычки % - '%.%.%'. Благодарю.
2 мар 13, 00:16    [14002012]     Ответить | Цитировать Сообщить модератору
 Re: Адекватная замена ISNUMERIC (2008)  [new]
MiCe
Member

Откуда: RUSSIA STAVROPOL Pyatigorsk
Сообщений: 1996
это все на клиенте реализуется.....
если уж ну очень надо то clr
можно и в xml поковырять...
ну зачем это в базе?
2 мар 13, 01:29    [14002254]     Ответить | Цитировать Сообщить модератору
 Re: Адекватная замена ISNUMERIC (2008)  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
MiCe
это все на клиенте реализуется.....
ну зачем это в базе?
целиком согласен. база это не то место где надо валидацией заниматься.
целостность, уникальность, связность проверять это да. всякие бизнес правила конечно.
но все что возможно надо на клиенте делать.
2 мар 13, 05:16    [14002495]     Ответить | Цитировать Сообщить модератору
 Re: Адекватная замена ISNUMERIC (2008)  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3755
leov
MiCe
это все на клиенте реализуется.....
ну зачем это в базе?
целиком согласен. база это не то место где надо валидацией заниматься.
целостность, уникальность, связность проверять это да. всякие бизнес правила конечно.
но все что возможно надо на клиенте делать.

да полно причин делать это в БД. Например загружаем данные из текстовых файлов из чужих источников, какой самый быстрый способ это сделать? Правильно BCP !! В BCP isnumeric не прикрутишь - поэтому вставляем текстом, а потом уже чтобы в базе обеспечить целостность и уникольность нужно загруженный мусор разобрать!!!!!!
4 мар 13, 10:53    [14007423]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить