Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Case % convert  [new]
Tester666
Member

Откуда:
Сообщений: 179
Доброго времени суток! Вопрос такой - в зависимости от типа необходимо получить значения из разных столбцов, делаю следующий запрос (фрагмент) -
select case s.inType when 0 then v.stValue --строковое значение
                             when 1 then v.inValue --целочисленное значение
                             when 2 then v.reValue --вещественное значение
                             when 3 then case when isdate(v.dtValue)=1 then convert(datetime,convert(varchar(20),v.dtValue,112) + ' ' + convert(varchar(20),v.dtValue,108))
  --дата                                   
                                                 end
         else v.stValue
         end
from table1 s inner join table2 v on s.inid = v.inidattr
Типы данных столбцов значений -
stValue varchar(255),
inValue int,
reValue float,
dtValue datetime
При этом , если тип = 3 выдает нужное значение, а если другой, то - ошибку:
Conversion failed when converting date and/or time from character string.
Если я закоментирую строку, возвращающую v.dtValue, все работает.
Как быть в этом случае?
11 июл 11, 11:31    [10954596]     Ответить | Цитировать Сообщить модератору
 Re: Case % convert  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Tester666,

тип поля в запросе не может зависеть от строки. Он один. Вот правила: http://msdn.microsoft.com/ru-ru/library/ms190309.aspx
11 июл 11, 11:37    [10954644]     Ответить | Цитировать Сообщить модератору
 Re: Case % convert  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Либо используйте тип SQL_VARIANT (gjcnjzyyj придётся явно приводить типы)
или строковые представления различных типов данных

А ещё лучше - пересмотрите архитектуру Вашей базы. Там не всё в порядке.
11 июл 11, 11:39    [10954662]     Ответить | Цитировать Сообщить модератору
 Re: Case % convert  [new]
_Groxot_
Member

Откуда: Оттуда
Сообщений: 481
Tester666,

Все конвертить к varchar....
11 июл 11, 11:40    [10954669]     Ответить | Цитировать Сообщить модератору
 Re: Case % convert  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
_Groxot_
Tester666,

Все конвертить к varchar....


Лучше это к SqlVariant, а правильно - изменить архитектуру.
11 июл 11, 11:51    [10954759]     Ответить | Цитировать Сообщить модератору
 Re: Case % convert  [new]
Tester666
Member

Откуда:
Сообщений: 179
По поводу пересмотра архитектуры:
Есть таблица атрибутов, есть таблица значений атрибутов. Атрибуты создают пользователи.
И естественно они могут быть разных значений. Поэтому в таблицу значений атрибутов добавлены поля разных типов -
stValue varchar(255), inValue int, reValue float, dtValue datetime.
И в 1 из этих полей хранится нужное значение для 1 атрибута.
По-моему достаточно логично.
По поводу Все конвертить к varchar...:
Если сделать так -
select case s.inType when 0 then v.stValue --строковое значение
                             when 1 then v.inValue --целочисленное значение
                             when 2 then v.reValue --вещественное значение
                             when 3 then case when isdate(v.dtValue)=1 then convert(/*datetime*/varchar(50),convert(varchar(20),v.dtValue,112) + ' ' + convert(varchar(20),v.dtValue,108))
  --дата                                   
                                                 end
         else v.stValue
         end
from table1 s inner join table2 v on s.inid = v.inidattr
При получении значения типа дата выйдет следующая ошибка - Error converting data type varchar to float.
Для всех остальных будут верные значения.
11 июл 11, 11:54    [10954787]     Ответить | Цитировать Сообщить модератору
 Re: Case % convert  [new]
_Groxot_
Member

Откуда: Оттуда
Сообщений: 481
Ken@t,

Ну судя по вопросу это будет проще и понятнее автору.
А так согласен с вами на 200%
11 июл 11, 11:56    [10954797]     Ответить | Цитировать Сообщить модератору
 Re: Case % convert  [new]
Glory
Member

Откуда:
Сообщений: 104751
Tester666
При получении значения типа дата выйдет следующая ошибка - Error converting data type varchar to float.
Для всех остальных будут верные значения.

Вы прочитали ссылку на документацию.
BOL - CASE
Result Types
Returns the highest precedence type from the set of types in result_expressions and the optional else_result_expression. For more information, see Data Type Precedence (Transact-SQL).
11 июл 11, 11:56    [10954799]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить