Формула столбца компьютера SQL - PullRequest
0 голосов
/ 25 апреля 2011

Таблица SQL (Сделки) имеет три поля AvgProfit, MinProfit и Hold - Hold - это вычисляемый столбец ...

Если AvgProfit MinProfit, Hold ='Trade' Формула Computed Col для Hold выглядит следующим образом:

 SQL Table Trades
 AvgProfit varchar(35)
 MinProfit varchar(35)
 Hold varchar(35)


 (case when CONVERT([decimal](8,4),isnull([AvgProfit],(0)),(0))>=CONVERT([decimal](8,4),isnull([MinProfit],(0)),(0)) then 'Trade' else 'Hold' end)

ПРОБЛЕМА: Обновления приводят к тому, что AvgProfit время от времени становится пустым, и это приводит к ошибке, когда таблица ссылается на формулу Hold

'Error Converting varchar to numeric'

Как добавить IS NULL или ПУСТО в вышеприведенную формулу, ISNULL не перехватывает AvgProfit = '' ??

Ответы [ 2 ]

0 голосов
/ 25 апреля 2011

Попробуйте набрать в вашей базе данных десятичные или числовые столбцы, как предложил paxdiablo.Есть ли причина, по которой эти столбцы установлены как varchar?

В качестве альтернативы, если вам нужно сохранить столбцы varchar, попробуйте ISNUMERIC (), http://msdn.microsoft.com/en-us/library/ms186272.aspx.. Он работает со всеми распространенными числовыми типами SQL.Таким образом, ваш запрос может выглядеть следующим образом:

ISNUMERIC может использоваться следующим образом:

select case when ISNUMERIC('123') = 1 then 1 else 0 end ' returns 1
select case when ISNUMERIC('xyz') = 1 then 1 else 0 end ' returns 0
select case when ISNUMERIC(null) = 1 then 1 else 0 end ' returns 0

Таким образом, ваш запрос может выглядеть так:

case when isnumeric(AvgProfit) = 1 THEN case([AvgProfit] as decimal) else 0 END

или что-то подобное.

0 голосов
/ 25 апреля 2011

varchar столбцы должны использоваться для столбцов CHARacter размера VARiable, не для числовых данных.

Другими словами, они не должны быть пустыми (кроме NULL, конечно, но вы позаботились об этом).

Если вы по какой-то причине не можете исправить этот небольшой недосмотр, вы можете сделать свои запросы еще более сложными и медленными :-), выполнив что-тонапример:

select case when xyz = '' then 0 when isnull(xyz) then 0 else xyz end ...

Другими словами, проверьте оба значения: NULL и пусто varchar.

Сам, я бы исправил схему, так как она будетбудет лучше для вас в долгосрочной перспективе.Я просто предлагаю другое решение на случай, если вы не сможете этого сделать.

...