1

次のようなテーブルがあるとします。

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

それから私はSQLのようなものを持っています

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

MyDateMyIs値がnullDB にある場合、結果は次のようになります。

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

のような期待値ではありません

MyDate        MyIs  
1             999

したがって、戻り値は列のデータ型に基づいているようです。この問題を解決するにはどうすればよいですか?

上記のテスト ケースでは、テーブルから 1 行しか取得できませんでした。

4

4 に答える 4

3

あなたが探している方法はありません。

同じ列のすべての値は、同じデータ型である必要があります。データの一部の行に NOT NULL 値があり(列のデータ型を返す)、他の行に NULL 値がある (ステートメントに従って別のデータ型を返すCASE)場合、この要件に違反します。

2 つのフィールドを追加できます...

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()DATETIMEBITINT

しかし、おそらく、最初にこれを行う理由を確認し、別の設計を考え出すでしょう。

于 2012-05-29T13:47:12.300 に答える
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 に答える
0

データ型を混同しています。

たとえば、データをテストすると、整数1 が返されます。これは、SQL サーバーが + 1 (日) からカウントを開始するデータに変換されます。

于 2012-05-29T13:45:50.837 に答える