2012-05-29 3 views
1

Предположим, что у меня есть таблица, как:IsNull и тип данных в SQL Server

Tab(MyDate datetime null, MyIs bit null, ...) 

Тогда у меня есть SQL Как

select Isnull(MyDate, 1), IsNull(MyIs, 999) from Tab; 

Если MyDate, MyIs значение в БД null, результат:

MyDate     MyIs 
    1900-01-02 00:00:00.000 1 

Не ожидаемое значение, например

MyDate  MyIs 
1    999 

Таким образом, похоже, что возвращаемое значение основано на типе данных столбца. Как решить эту проблему?

Для моего теста, как указано выше, я получил только одну строку из таблицы.

+0

Что произойдет, если некоторые строки имеют действительные даты - то, что тип данных столбца даты тогда? – Dave

+0

если нет нулевого значения, это нормально. – KentZhou

+0

'MyDate' возвращается как один день после начала времени, по запросу. «MyIs» - это значение, отличное от 0. Нет выбора, если вы «BIT». Если вы 'CAST'' MyIs' в 'INT', то вы можете получить желаемый результат. «DATETIME» просто не будет 1, если вы не всегда будете отображать его как количество дней с момента BoT. – HABO

ответ

3

То, как вы смотрите для, вы этого не делаете.

Все значения в той же колонке должны быть быть одинаковыми. Если в некоторых строках у вас не было значений NULL (возврат типа данных столбца) и значения NULL в других строках (возврат другого типа данных в соответствии с оператором CASE), вы нарушили бы это требование.

Вы можете иметь два дополнительных поля ...

select 
    MyDate, 
    CASE WHEN MyDate IS NULL THEN 1 ELSE 0 END As MyDateWibble, 
    MyIs, 
    CASE WHEN MyIs IS NULL THEN 999 ELSE 0 END AS MyIsWibble 
FROM 
    Tab; 

Вы могли CAST() все, чтобы VARCHAR() и возвращать строки вместо DATETIME, BIT или INT.

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

+0

Спасибо. Я сделал для этого сравнение стоимости. Я использую что-то вроде: isnull (a.MyDate, 1) <> isnull (b.MyDate, 1), тогда я обнаружил, что в некоторых случаях проблема с нулевым значением. – KentZhou

+0

@KentZhou - Почему вы пытаетесь это сделать? Если вы хотите сравнить это поле в соединении, используйте это вместо ... 'NOT (a.MyDate = b.MyDate OR (a.MyDate IS NULL AND b.MyDate IS NULL))' Это не так коротка, как у вас есть , но он работает. Подход 'ISNULL()' требует, чтобы вы использовали значения замещения, которые * не могут * отображаться в другом месте данных, и для этих значений один и тот же тип данных. – MatBailie

+0

Спасибо. Ваше решение отлично. – KentZhou

0

Вы смешиваете типы данных.

Например, при тестировании на данных, которые вы вернуть целое 1. Это переводятся на данных, где SQL Server начинает отсчет от + 1 (день)

+0

OP уже знает, что много. Так что похоже, что возвращаемое значение основано на типе данных столбца. «Но возникает вопрос:« Как решить эту проблему? »Ответ на этот вопрос, вероятно,« Измените ваши требования ». – MatBailie

0

вы можете сделать

select 
    case when mydate is null 
    then '1' else cast(mydate as varchar(40)) 
    end, 
    case when MyIs is null 
    then 999 else MyIs 
    end 
from tab 

enter image description here

+1

OP не хочет, чтобы дата появлялась в столбце 1 строки 1. Оператор хочет, чтобы там появилось число 1. Совсем другой тип данных, из которого op хочет появиться в столбце 1 строки 2. Это невозможно. – MatBailie

+0

спасибо за головы, я этого не осознавал. Я меняю sql casting на строку. Я думаю, что он решает проблему OPs. Существует подробная информация о формате даты, но она может быть изменена по мере необходимости. – Diego

+0

fyi, как я понимаю, когда дата действительна, он хочет, чтобы дата была в правильном формате. – Diego

0

сервера SQL «нулевым» дата или базы является 1900-01-01, так что вы просто преобразованием MYDate нуля с 1 так что добавлением 1 дня в базовая дата, как

declare @d datetime = 1 
select @d 

1900-01-02 00:00:00.000 

set @d = 0 
select @d 

1900-01-01 00:00:00.000 

MyIs тип бит, так что ничего, кроме 0 «1», как

declare @b bit = 0 
select @b 

set @b = 1 
select @b 

set @b = -1 
select @b 

Над поведением колонн из-за различного data types

+0

OP уже знает причину поведения 'Таким образом, похоже, что возвращаемое значение основано на типе данных столбца.' ОП ищет работу. Это просто объясняет, что ОП уже разработал. – MatBailie

+0

@ Вы правы и потому, что уже ответили на эту часть, поэтому я этого не делал. – Kashif