2017-12-28 27 views
0

以下の最初のケースグループ(Err1)は、他の2つのケースグループErr2とErr3を削除しない限り、最初のWhenを評価しません。私はもともとこれらを連結して1つの列を作成していましたが、上記のように機能していました。私はこれを別々の列に分割することで私の問題は解決すると思ったが、喜びはなかった。ケースが期待どおりに動作していない - Transact SQL

SELECT 
    *, 
    CASE 
     WHEN ISNULL(Approval_Date, 0) = 0 
      THEN 'Approval Date is Missing' + Char(13) + Char(13) 
      ELSE 
      CASE WHEN First_Spend > (ISNULL(Approval_Date, 0) + 15) 
        THEN 'Approval Date is too far in the past' + char(13) + Char(13) 
        WHEN (First_Spend + 25) < ISNULL(Approval_Date, 0) 
        THEN 'Approval Date is too far in the future' + char(13) + Char(13) 
      END 
    END AS 'ERR1', 
    CASE 
     WHEN Funding_Status = '' 
      THEN 'Funding Status is Missing' + Char(13) + Char(13) 
    END AS 'ERR2', 
    CASE 
     WHEN Funding_Type = '' 
      THEN 'Funding Type is Missing' + Char(13) + Char(13) 
    END AS 'ERR3' 

私はさまざまな方法でこれを試しましたが、結果は正しくありません。どんな明るいアイデアも高く評価します

おかげ

+1

まあ、approval_dateは常に「NULL」または「0」でなければなりません。 –

+2

クエリの期待値と実際の出力に関するサンプルデータはありますか? –

+0

ネストされたケースに欠けているelsesを追加しようとしましたか? – fabricio

答えて

0

試してみてくださいこの:

SELECT *, 
     CASE 
      WHEN ISNULL(Approval_Date, 0) = 0 THEN 'Approval Date is Missing' + Char(13) + Char(13) 

      WHEN First_Spend > (ISNULL(Approval_Date, 0) + 15) THEN 'Approval Date is too far in the past' + char(13) + Char(13) 

      WHEN (First_Spend + 25) < ISNULL(Approval_Date, 0) THEN 'Approval Date is too far in the future' + char(13) + Char(13) 
     END AS 'ERR1', 
     CASE 
      WHEN Funding_Status = '' THEN 'Funding Status is Missing' + Char(13) + Char(13) 
     END AS 'ERR2', 
     CASE 
      WHEN Funding_Type = '' THEN 'Funding Type is Missing' + Char(13) + Char(13) 
     END AS 'ERR3' 
1

あなたの日付は、日付のように定義されるように表示されない、そして、あなたがこれを知っていれば私を許しますが、空の文字列がnullと同じではありません。

以下の例は、あなたがしたいと思うものを示していますが、適切なデータ型を使用しています。適切なデータ型を使用することを強くお勧めします。

そして、誤解を取り除くために、case文の1つの条件が真であるとすぐに、続くwhen節は評価されません。 err1、err2、およびerr3は独立したcase文であるため、常にすべて評価する必要がありますが、ネストされたcase文はerr1に依存します。

また、char(13)はキャリッジリターンです。これにより出力行が上書きされます。おそらく、あなたは改行(またはあなたがWindows上で動いているならば両方)であるchar(10)を望んでいます。

create table so48010818 
(
    id    int, 
    approval_date  date, 
    first_spend  date, 
    funding_status varchar(1), 
    funding_type  varchar(1) 
); 

insert into so48010818 (id, approval_date, first_spend, funding_status, funding_type) values (1, null, '2017-12-28', '', ''); 
insert into so48010818 (id, approval_date, first_spend, funding_status, funding_type) values (2, '2017-12-20', '2017-12-28', '', ''); 
insert into so48010818 (id, approval_date, first_spend, funding_status, funding_type) values (3, '2017-12-12', '2017-12-28', '', ''); 
insert into so48010818 (id, approval_date, first_spend, funding_status, funding_type) values (4, '2017-12-27', '2017-12-01', '', ''); 
insert into so48010818 (id, approval_date, first_spend, funding_status, funding_type) values (5, null, '2017-12-28', null, null); 
insert into so48010818 (id, approval_date, first_spend, funding_status, funding_type) values (6, '2017-12-20', '2017-12-28', null, null); 
insert into so48010818 (id, approval_date, first_spend, funding_status, funding_type) values (7, '2017-12-12', '2017-12-28', null, null); 
insert into so48010818 (id, approval_date, first_spend, funding_status, funding_type) values (8, '2017-12-27', '2017-12-01', null, null); 
insert into so48010818 (id, approval_date, first_spend, funding_status, funding_type) values (5, null, '2017-12-28', 'X', 'Y'); 
insert into so48010818 (id, approval_date, first_spend, funding_status, funding_type) values (6, '2017-12-20', '2017-12-28', 'X', 'Y'); 
insert into so48010818 (id, approval_date, first_spend, funding_status, funding_type) values (7, '2017-12-12', '2017-12-28', 'X', 'Y'); 
insert into so48010818 (id, approval_date, first_spend, funding_status, funding_type) values (8, '2017-12-27', '2017-12-01', 'X', 'Y'); 

select * from so48010818; 

select 
    id, 
    approval_date, 
    first_spend, 
    funding_status, 
    funding_type, 
    case 
     when approval_date is null then 'approval date is missing (null)' 
    else    -- approval_date cannot be null here 
     case 
      when first_spend > dateadd(day, 15, approval_date) then 'approval date is too far in the past' 
      when dateadd(day, 25, first_spend) < approval_date then 'approval date is too far in the future' 
     end 
    end as 'err1', 
    case 
     when funding_status is null then 'funding status is missing (null)' 
     when funding_status = '' then 'funding status is missing (empty string)' 
    end as 'err2', 
    case 
     when funding_type is null then 'funding type is missing (null)' 
     when funding_type = '' then 'funding type is missing (empty string)' 
    end as 'err3' 
from 
    so48010818; 

id   approval_date first_spend  funding_status funding_type err1         err2          err3 
----------- ---------------- ---------------- -------------- ------------ ------------------------------------- ---------------------------------------- ----------------------------- -------- 
      1    NULL  2017-12-28        approval date is missing (null)  funding status is missing (empty string) funding type is missing (empty string) 
      2  2017-12-20  2017-12-28        NULL         funding status is missing (empty string) funding type is missing (empty string) 
      3  2017-12-12  2017-12-28        approval date is too far in the past funding status is missing (empty string) funding type is missing (empty string) 
      4  2017-12-27  2017-12-01        approval date is too far in the future funding status is missing (empty string) funding type is missing (empty string) 
      5    NULL  2017-12-28 NULL   NULL   approval date is missing (null)  funding status is missing (null)   funding type is missing (null) 
      6  2017-12-20  2017-12-28 NULL   NULL   NULL         funding status is missing (null)   funding type is missing (null) 
      7  2017-12-12  2017-12-28 NULL   NULL   approval date is too far in the past funding status is missing (null)   funding type is missing (null) 
      8  2017-12-27  2017-12-01 NULL   NULL   approval date is too far in the future funding status is missing (null)   funding type is missing (null) 
      5    NULL  2017-12-28 X    Y   approval date is missing (null)  NULL          NULL 
      6  2017-12-20  2017-12-28 X    Y   NULL         NULL          NULL 
      7  2017-12-12  2017-12-28 X    Y   approval date is too far in the past NULL          NULL 
      8  2017-12-27  2017-12-01 X    Y   approval date is too far in the future NULL          NULL 

(12 rows affected) 
0

ありがとうございました。皆さんは正しい軌道に乗っていました。大きな問題は、ケースのいくつかがnullを返すことでした。元のバージョンは実際には機能しましたが、「承認日がありません」と「承認日が過去にあまりにも遠すぎます」というエラーが返されました。これは同じエラーになります。

私はElsesを追加しました。重複したエラーを排除するために承認日のisnull値を使用して再生し、First_Spendの日付が失われる可能性を修正しました。これは今のようになります:

SELECT *, 
Case When Approval_Date is null then 'Approval Date is Missing' + Char(13) + Char(13) Else ''End + 
Case When Funding_Status = '' then 'Funding Status is Missing' + Char(13) + Char(13) Else '' End + 
Case When Funding_Type = '' then 'Funding Type is Missing' + Char(13) + Char(13) Else '' End + 

Case 
    When ISNULL(First_Spend,0) >(isnull(Approval_Date,CAST('12/12/2099' AS DATETIME)) + 15) then 'Approval Date is too far in the past' + char(13) + Char(13) 
    When (ISNULL(First_Spend,CAST('12/12/2099' AS DATETIME)) +25) < isnull(Approval_Date,0) then 'Approval Date is too far in the future' + char(13) + Char(13) 
    Else '' End as 'ERR' 
関連する問題