1

假设我有一个像这样的表:

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

然后我有 SQL Like

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

如果MyDate,MyIsnull在 DB 中,则结果为:

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

不是期望值

MyDate        MyIs  
1             999

所以看起来返回值是基于列的数据类型。如何解决这个问题?

对于我上面的测试用例,我只从表中得到了一行。

4

4 回答 4

3

你正在寻找的方式,你没有。

同一列中的所有值必须是相同的数据类型。如果您的数据在某些行中具有 NOT 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,BITINT.

但是,更有可能的是,我首先会回顾您想要这样做的原因并制定替代设计。

于 2012-05-29T13:47:12.300 回答
0

您正在混淆数据类型。

例如,当您测试数据时,您返回整数1。这将被转换为 sql server 从 + 1(天)开始计数的数据

于 2012-05-29T13:45:50.837 回答
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

在此处输入图像描述

于 2012-05-29T13:59:43.810 回答
0

SQL 服务器“零”日期或基准日期为 1900-01-01,因此您只需将MYDatenull 转换为 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

于 2012-05-29T14:01:06.440 回答