Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите с запросом  [new]
M_a_r_i_a
Guest
Всем привет!!! Народ, помогите, плиз
есть таблица Table1 у нее поля:
idInvent int
sValue varchar

у строк где id=5 в поле sValue пишется число(целое) - это точно и проверено.

надо выбрать строки у которых convert(decimal(12,0), UIT_InventVal.sValue )/1048576 >512
запрос
select id, convert(decimal(12,0), UIT_InventVal.sValue )/1048576 as S
from Table1
where idInvent=5

отрабатывает но стоит только поставить условие
select id, convert(decimal(12,0), UIT_InventVal.sValue )/1048576 as S
from Table1
where idInvent=5 and convert(decimal(12,0), UIT_InventVal.sValue )/1048576 >512
как ошибка :
Msg 8114, Level 16, State 5, Line 1
Error converting data type varchar to numeric.
какая-то фигня......ПАМАГИТЕ!!!! SOS SOS )))))
17 авг 09, 09:57    [7544729]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
aleks2
Guest
where idInvent=5 and CASE idInvent WHEN 5 THEN convert(decimal(12,0), UIT_InventVal.sValue )/1048576 END >512 
17 авг 09, 09:59    [7544744]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
select id,
 CASE
  WHEN ISNUMERIC(UIT_InventVal.sValue)=1
   AND UIT_InventVal.sValue LIKE '%[0-9]%'
   AND UIT_InventVal.sValue NOT LIKE '%[^-+. 0-9]%'
  THEN UIT_InventVal.sValue
 END/1048576 as S
from Table1 
where idInvent=5;
17 авг 09, 10:04    [7544773]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
M_a_r_i_a
Guest
попробовала, орет ошибку :
Msg 4145, Level 15, State 1, Line 19
An expression of non-boolean type specified in a context where a condition is expected, near 'end'.
17 авг 09, 10:07    [7544787]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iap
select id,
 CASE
  WHEN ISNUMERIC(UIT_InventVal.sValue)=1
   AND UIT_InventVal.sValue LIKE '%[0-9]%'
   AND UIT_InventVal.sValue NOT LIKE '%[^-+. 0-9]%'
  THEN UIT_InventVal.sValue
 END/1048576 as S
from Table1 
where idInvent=5;
WHERE idInvent=5
  AND CASE
       WHEN ISNUMERIC(UIT_InventVal.sValue)=1
        AND UIT_InventVal.sValue LIKE '%[0-9]%'
        AND UIT_InventVal.sValue NOT LIKE '%[^-+. 0-9]%'
       THEN UIT_InventVal.sValue
      END/1048576>512
17 авг 09, 10:07    [7544789]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
M_a_r_i_a
попробовала, орет ошибку :
Msg 4145, Level 15, State 1, Line 19
An expression of non-boolean type specified in a context where a condition is expected, near 'end'.
попробовала что???
17 авг 09, 10:10    [7544802]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
M_a_r_i_a
Guest
iap
УРА!!!! получилось!!!!
СПасибо всем огромное!!! чмок-чмок!!!
только не очень понятно, зачем в where вставлять эту проверку если и так известно, что в этом поле при таких idInvent число ???
17 авг 09, 10:14    [7544833]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
M_a_r_i_a
если и так известно, что в этом поле при таких idInvent число ???


вам известно, а оптимизатору нет...
17 авг 09, 10:16    [7544837]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104760
M_a_r_i_a

только не очень понятно, зачем в where вставлять эту проверку если и так известно, что в этом поле при таких idInvent число ???

Потому что сервер может вычислять выражения ДО фильтрации записей.
Поэтому все нормальные люди числа хранят числовых же полях, а не в символьных
17 авг 09, 10:17    [7544841]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
или
select q.id, q.s from
(select id, convert(decimal(12,0), UIT_InventVal.sValue )/1048576 as S
from Table1) q
where q.id=5  and q.s > 512
17 авг 09, 10:17    [7544845]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
M_a_r_i_a
iap
УРА!!!! получилось!!!!
СПасибо всем огромное!!! чмок-чмок!!!
только не очень понятно, зачем в where вставлять эту проверку если и так известно, что в этом поле при таких idInvent число ???
Сервер имеет право выполнять условия в WHERE в любом логически допустимом порядке.
Так что если он начнёт с idInvent=5, то хорошо, а если сначала будет выполнять CAST/CONVERT, то - плохо.
Серверу же надо выбрать оптимальный по скорости план...
17 авг 09, 10:19    [7544858]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Ramin
или
select q.id, q.s from
(select id, convert(decimal(12,0), UIT_InventVal.sValue )/1048576 as S
from Table1) q
where q.id=5  and q.s > 512
И что же гарантирует, что в CONVERT не попадут "неправильные" строки?
17 авг 09, 10:21    [7544871]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
iap
Ramin
или
select q.id, q.s from
(select id, convert(decimal(12,0), UIT_InventVal.sValue )/1048576 as S
from Table1) q
where q.id=5  and q.s > 512
И что же гарантирует, что в CONVERT не попадут "неправильные" строки?


and q.s > 512
17 авг 09, 10:25    [7544894]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
M_a_r_i_a
Guest
iap!!!
Все поняла, спасибки огромное!!!
17 авг 09, 10:25    [7544896]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
M_a_r_i_a
Guest
Glory,

да, безусловно......но дело в том что при idInveent=5 это число, при других idInvent это символы .......вообщем такая вот куча
17 авг 09, 10:28    [7544908]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Ramin
iap
Ramin
или
select q.id, q.s from
(select id, convert(decimal(12,0), UIT_InventVal.sValue )/1048576 as S
from Table1) q
where q.id=5  and q.s > 512
И что же гарантирует, что в CONVERT не попадут "неправильные" строки?


and q.s > 512
Но это ограничение сервер может отложить "на потом".
17 авг 09, 10:28    [7544916]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
M_a_r_i_a
но дело в том что при idInveent=5 это число, при других idInvent это символы .......вообщем такая вот куча

ааа про символы незнал ... извиняюс....
17 авг 09, 10:30    [7544924]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить